如何在Perl中使用Bless Operator?

时间:2013-06-20 11:36:00

标签: perl bless

任何人都可以解释重要性以及如何在perl中使用祝福。 我已经阅读了许多关于堆栈溢出的线程,但是它们并不清楚。

3 个答案:

答案 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中构造对象的旧方法。对于新代码,我建议改用MooseMooObject::Tiny

这些选项是从最大的尺寸和复杂度(驼鹿)到最简单的最少特征(Object :: Tiny)订购的。

如果您在其他perl代码中看到bless,则其功能与其他答案描述的一样。