Perl类变量
我似乎无法创建一个对该类全局且在该类的所有子例程中都可用的变量 我看到的例子到处都是,显然是工作,但我不能得到任何我做的工作 代码: 输出:Perl类变量,perl,Perl,我似乎无法创建一个对该类全局且在该类的所有子例程中都可用的变量 我看到的例子到处都是,显然是工作,但我不能得到任何我做的工作 代码: 输出: Use of uninitialized value $Player::URL in print at D:\Text\Programming\Hockey\test.pl line 19. Use of uninitialized value $Player::test0 in print at D:\Text\Programming\Hockey\te
Use of uninitialized value $Player::URL in print at D:\Text\Programming\Hockey\test.pl line 19.
Use of uninitialized value $Player::test0 in print at D:\Text\Programming\Hockey\test.pl line 20.
Use of uninitialized value $test1 in print at D:\Text\Programming\Hockey\test.pl line 21.
Use of uninitialized value $Player::test2 in print at D:\Text\Programming\Hockey\test.pl line 22.
Use of uninitialized value $test3 in print at D:\Text\Programming\Hockey\test.pl line 23.
Use of uninitialized value $Player::test4 in print at D:\Text\Programming\Hockey\test.pl line 24.
这是怎么回事?虽然在执行任何代码之前都会编译整个代码,但可执行部分是按顺序进行的。特别是,新()调用发生在package Player中的任何赋值或常量调用之前
将所有播放器代码移动到Player.pm文件中,并使用
use Player调用它代码>将使其在新代码之前立即编译和执行,并按预期工作。虽然在执行任何代码之前将编译整个代码,但可执行部分按顺序发生。特别是,新()调用发生在package Player中的任何赋值或常量调用之前
将所有播放器代码移动到Player.pm文件中,并使用use Player调用它代码>将使它在新代码之前立即编译和执行,并按预期工作。包级代码
my $test = new Player(8470598);
$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';
正在包级别代码之前执行
my $test = new Player(8470598);
$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';
因为它出现在文件的前面
如果要内联包,请更改
use Player;
到
你有时可以抄近路。在这种情况下,您可以同时剪切:
BEGIN
不需要
$INC{“Player.pm”}=1代码>可以通过删除使用播放器来删除代码>
包装级别代码
my $test = new Player(8470598);
$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';
正在包级别代码之前执行
my $test = new Player(8470598);
$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';
因为它出现在文件的前面
如果要内联包,请更改
use Player;
到
你有时可以抄近路。在这种情况下,您可以同时剪切:
BEGIN
不需要
$INC{“Player.pm”}=1代码>可以通过删除使用播放器来删除代码>
另一种方法是初始化(但不声明)INIT
或BEGIN
块中的变量。哦,似乎已经修复了它。这是一个奇怪的执行顺序。因此,在执行到达类之前,不会执行类变量。这是错误的行为,对吗?Perl应该在开始正常执行之前执行包中的免费代码,对吗?在类完全创建之前能够调用该类中的方法是很奇怪的。您可以通过将代码移动到一个单独的文件并使用将其封装,或者将其封装在一个BEGIN块中来实现这一点。代码并不是真正的“在”一个包中;package语句所做的只是将任何非限定标识符的默认包从该点更改为下一个包或封闭块或文件的结尾(并更改\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。package
语句的唯一区别是更改任何包变量的默认名称空间(用our
声明)。虽然在一个源文件中可以有多个包语句,但很难使事情正常运行,正确的方法是将每个模块放在一个*.pm
文件中,该文件与其包同名,并从需要它的源文件中使用它。至少你应该把main
包放在程序文件的最后一位,这样任何初始化都会先完成。my$test=newplayer(8470598)代码>也是包中的免费代码!另一种方法是初始化(但不声明)INIT
或BEGIN
块中的变量。哦,似乎已经修复了它。这是一个奇怪的执行顺序。因此,在执行到达类之前,不会执行类变量。这是错误的行为,对吗?Perl应该在开始正常执行之前执行包中的免费代码,对吗?在类完全创建之前能够调用该类中的方法是很奇怪的。您可以通过将代码移动到一个单独的文件并使用将其封装,或者将其封装在一个BEGIN块中来实现这一点。代码并不是真正的“在”一个包中;package语句所做的只是将任何非限定标识符的默认包从该点更改为下一个包或封闭块或文件的结尾(并更改\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。package
语句的唯一区别是更改任何包变量的默认名称空间(用our
声明)。虽然在一个源文件中可以有多个包语句,但很难使事情正常运行,正确的方法是将每个模块放在一个*.pm
文件中,该文件与其包同名,并从需要它的源文件中使用它。至少你应该把main
包放在程序文件的最后一位,这样任何初始化都会先完成。my$test=newplayer(8470598)代码>也是包中的免费代码!