我不能做像
这样的事情#! usr/bin/perl
use strict;
use warnings;
use Horse; #this is the package
my $test;
bless $test,Horse;
上面的代码是否将$test
实例化为对Horse包的对象引用?或者Perl中的对象只是“已经有bless
语句”等待实例化的包?
另外,您是否可以提供对象变量或方法或函数的样本访问?无论它在Perl中被称为什么?
答案 0 :(得分:4)
bless
builtin使用包名称标记引用。然后,该包用于解析在对象上调用的方法。所以,即使没有明确的包,也可以做
my $obj = bless { x => 1}, 'Foo';
sub Foo::x {
my $self = shift;
return $self->{x};
}
print "1 == ", $obj->x, "\n";
请注意,您应引用提供给bless
的包名称。
所以是的,你可以祝福任何类的引用,包括导入的类。但请注意,这不会运行构造函数,并打破“封装”,这是一种面向对象的原则,您应该只使用方法与类/与对象进行交互(例如new
类方法)。
每个全局变量都有一个完全限定的名称,该名称由包名称和变量名称组成。子程序只是一种特殊的变量。例如,这个:
$Some::Package::var = 5;
sub Some::Package::give_var { return $Some::Package::var }
与
大致相同{
package Some::Package; # package declaration opens a new namespace
our $var = 5;
sub give_var { return $var }
}
因此,sub Foo::x {...}
在包x
中声明了一个名为Foo
的子。