我试图在Perl中找不到OO。我做了以下琐碎的课程:
#/usr/bin/perl
package Tools::Util;
use strict;
use warnings;
my $var;
sub new {
my ($class, $arg) = @_;
my $small_class = {
var => $arg,
};
return bless $small_class;
}
sub print_object {
print "var = $var\n"; #this is line 20
}
1;
这是一个测试脚本:
#!/usr/bin/perl
use strict;
use warnings;
use Tools::Util;
my $test_object = new Tools::Util("Some sentence");
$test_object->print_object();
use Data::Dumper;
print Dumper($test_object);
我得到的结果是:
Use of uninitialized value $var in concatenation (.) or string at Tools/Util.pm line 20.
var =
$VAR1 = bless( {
'var' => 'Some sentence'
}, 'Tools::Util' );
我无法理解这一点。我认为Perl中的对象是哈希值,因此我可以使用相同的名称访问/初始化成员变量而不使用$
。为什么在这种情况下$var
没有初始化,但是我转储的哈希包含值?
我应该如何使用/初始化/处理成员变量以及我在这里误解了什么?
答案 0 :(得分:4)
$var
是词汇类变量,在您的示例中未定义。
你可能想要:
sub print_object {
my $self = shift;
print "var = $self->{var}\n";
}
答案 1 :(得分:3)
Perl不像您习惯的那样处理对象方法。
您是否熟悉许多面向对象语言使用的隐式this
参数?如果没有,现在是阅读它的好时机。
这是一个五秒钟的介绍,掩盖了细节:
//pretend C++
//this function signature
MyClass::MyFunction(int x);
//is actually more like the following
MyClass::MyFunction(MyClass this, int x);
当您访问班级的实例成员时,my_var
相当于this.my_var
。
在Perl中,您可以手动执行此操作!变量$var
不等同于$self->{var}
。
您的祝福对象实际上是一个哈希引用,可以这样访问。当您调用$test_object->print_object()
时,sub会将$test_object
的值作为其第一个参数。大多数Perl程序员都这样处理:
sub my_method {
my $self = shift; #shift first argument off of @_
print $self->{field};
}
考虑到这一点,您可能应该重写print_object
子以匹配mpapec's answer。