任何人都可以解释重要性以及如何在perl中使用祝福。 我已经阅读了许多关于堆栈溢出的线程,但是它们并不清楚。
答案 0 :(得分:7)
这是一种使Perl将包视为面向对象的类,以及将受祝福的对象视为这些类的实例的方法。
祝福引用标记它,以便解释器知道它与哪个包相关联。例如,如果你写:
$x = {}; bless $x, "somepackage";
然后你可以写下:
$x->method(1, 2, 3);
口译员将此视为:
somepackage::method($x, 1, 2, 3);
这是一个非常简单的例子。在名为MyClass.pm的文件中创建一个类:
package MyClass;
sub new {
my ($class_name) = @_;
my $new_instance = {};
bless $new_instance, $class_name;
return $new_instance;
}
sub set {
my ($self, $name, $value) = @_;
$self->{$name} = $value;
}
sub get {
my ($self, $name) = @_;
return $self->{$name};
}
现在您可以在代码中使用该类:
import MyClass;
my $instance = MyClass->new; # Same as MyClass::new("MyClass")
$instance->set('age', 30); # Same as MyClass::set($instance, 'age', 30)
print $instance->get('age'); # Same as MyClass::get($instance, 'age')
arrow运算符结合了bless如何绑定对包名的引用,为您提供了很好的面向对象语法。
答案 1 :(得分:2)
perlobj documentation的最顶部通过示例提供了有用的解释。
对象只是一种数据结构
与支持面向对象的许多其他语言不同,Perl 没有为构造对象提供任何特殊语法。 对象只是Perl数据结构(哈希,数组,标量, 已明确与a关联的文件句柄等) 特别的课程。
显式关联由内置
bless
函数创建, 它通常在构造函数子程序中使用 类。这是一个简单的构造函数:
package File; sub new { my $class = shift; return bless {}, $class; }
名称
new
并不特别。我们可以为构造函数命名 否则:package File; sub load { my $class = shift; return bless {}, $class; }
OO模块的现代约定是始终使用new作为名称 对于构造函数,但没有要求这样做。任何 将数据结构保存到类中的子例程是有效的 Perl中的构造函数。
在前面的示例中,
{}
代码创建了对空的引用 匿名哈希。然后,祝福功能采用该参考和 将哈希与$class
中的类相关联。在最简单的情况下,$class
变量最终将包含字符串"File"
。我们还可以使用变量来存储对数据结构的引用 我们的目标是幸运的:
sub new { my $class = shift; my $self = {}; bless $self, $class; return $self; }
一旦我们祝福
$self
引用的哈希,我们就可以开始调用了 方法就可以了。
答案 2 :(得分:1)
bless
是一种在Perl中构造对象的旧方法。对于新代码,我建议改用Moose,Moo或Object::Tiny。
这些选项是从最大的尺寸和复杂度(驼鹿)到最简单的最少特征(Object :: Tiny)订购的。
如果您在其他perl代码中看到bless
,则其功能与其他答案描述的一样。