Perl 取消引用一个子例程

Perl dereferencing a subroutine

我遇到过具有以下语法的代码:

$a -> mysub($b);

在查看它之后,我仍在努力弄清楚它的含义。任何帮助将不胜感激,谢谢!

这是一个 method call. $a is the invocant (a class name or an object), mysub is the method name, and $b is an argument. You should proceed to read perlootut 解释了所有这些。

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

它记录在 perlobj 中。虽然原理相当简单 - 对象是一种超级哈希,和数据一样,还包括内置代码。

这样做的好处是您的数据结构 'knows what to do' 及其内容。在基本层面上,这只是验证数据 - 因此您可以制作拒绝 "incorrect" 输入的哈希。

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

所以一个非常基本的例子可能是这样的:

#!/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"这是描述对象'works'的方式。在这个 class 中,我们设置了一个名为 mysub 的子例程 - 但因为它是一个 class,我们将其称为 "method" - 也就是说,一个子例程是特别是 绑定到一个对象。

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

另外:不要使用 $a$b 作为变量名。这个不干净。一方面是因为单个 var 名称是错误的,另一方面是因为这两个 特别是 用于 sort