Bra*_*oss 3 memory oop perl package
所以,我有点像perl newb.虽然我有一些更复杂的事情,但我突然遇到了障碍,无法弄清楚wtf是错误的代码.我已经大大简化了它,它只是一小段代码.
Test.pl
package Test;
sub new {
my ($class) = shift;
my $self = {
_attr => "asdfa"
};
bless $self, $class;
return $self;
}
sub log {
print "\nAccessed via class: ".$self->{_attr};
}
Run Code Online (Sandbox Code Playgroud)
process.pl
#!/usr/bin/perl
do "Test.pl";
use strict;
use warnings;
use diagnostics;
my($test) = new Test();
$test->log;
print "\nAccessed via main: ".$test->{_attr};
Run Code Online (Sandbox Code Playgroud)
我运行process.pl,得到以下输出
通过课程
访问:通过main访问:asdfa
我也得到了警告
在连接(.)中使用未初始化的值或在Test.pl第12行(#1)使用字符串(W未初始化)使用未定义的值,就像它已经定义一样.它被解释为""或0,但也许这是一个错误.要禁止此警告,请为变量分配定义的值.
所以问题是$ self实际上是未定义的.为什么,我不知道.这不是初始化对象的方法吗?
对象实例作为方法的第一个参数传递.通常要做的是将它存储在一个名为的变量中$self,但是perl不会为你设置它,你必须自己做:
sub log {
my $self = shift;
print "\nAccessed via class: ".$self->{_attr};
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然您已经定义strict并且warnings在主代码中,但您没有使用未定义的值静默创建的test.pl方式,$self而不是使用未声明的变量抛出编译错误.
此外,我建议你放入package Test一个名为的文件,在文件的末尾Test.pm单独添加一个真实的语句1;,然后通过说use Test;而不是来调用它do "test.pl".在Perl中编写模块化代码是一种更清晰的方式.
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |