Perl解除引用子例程

时间:2016-06-06 14:48:09

标签: perl reference subroutine

我遇到了使用以下语法的代码:

$a -> mysub($b);

在调查之后,我仍在努力弄清楚它意味着什么。任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:4)

您遇到的是面向对象的perl。

它记录在perlobj中。原理相当简单 - 对象是一种超级哈希,以及作为数据,也包含内置代码。

这样做的好处是,您的数据结构知道该怎么做'用它的内容。在基本级别,这只是验证数据 - 所以你可以制作一个拒绝"错误"输入

但它允许你做更复杂的事情。它的真正意义在于封装,这样我就可以编写一个模块,你可以利用它而不必关心它内部发生的事情 - 只有驱动它的机制。

所以一个非常基本的例子可能如下所示:

#!/usr/bin/env perl
use strict;
use warnings;

package MyObject;

#define new object
sub new {
   my ($class) = @_;
   my $self = {};
   $self->{count} = 0;
   bless( $self, $class );
   return $self;
}
#method within the object
sub mysub {
   my ( $self, $new_count ) = @_;
   $self->{count} += $new_count;
   print "Internal counter: ", $self->{count}, "\n";
}

package main;
#create a new instance of `MyObject`. 
my $obj = MyObject->new();
#call the method, 
$obj->mysub(10);
$obj->mysub(10);

我们定义" class"这是对象'如何工作的描述。在这个类中,我们设置了一个名为mysub的子程序 - 但由于它是一个类,我们将其称为"方法" - 即特定绑定到对象的子例程。

我们创建一个对象的新实例(基本上与my %newhash相同),然后调用其中的方法。如果创建多个对象,它们每个都拥有自己的内部状态,就像创建单独的哈希时一样。

另外:不要使用$a$b作为变量名称。很脏。两者都是因为单个var名称错误,而且因为这两个特别是用于sort

答案 1 :(得分:3)

这是method电话。 $a是调用者(类名或对象),mysub是方法名称,$b是参数。您应该继续阅读perlootut,其中解释了所有这些。