【发布时间】:2012-12-17 06:57:23
【问题描述】:
我在 perl 模块中多次遇到这条线,但我无法弄清楚这到底是什么意思。
my ($self, %myInputs) = @_;
请向我解释一下声明,以便我继续。
【问题讨论】:
标签: perl perl-module
我在 perl 模块中多次遇到这条线,但我无法弄清楚这到底是什么意思。
my ($self, %myInputs) = @_;
请向我解释一下声明,以便我继续。
【问题讨论】:
标签: perl perl-module
我猜这是类方法函数中的第一行。该行解析@_,即list of the function arguements,并提取第一个参数,该参数始终是对对象的引用到$self,并提取其余参数散列 %myInputs。这当然假设函数是用哈希格式的参数调用的,就像下面的 Perl/Tk 函数一样
$mw->Button(-text => "RIGHT", -command => sub { exit })
->pack(-side => 'right', -fill => 'both');
【讨论】:
我的 ($self, %myInputs) = @_;
并非所有函数都接收第一个参数$self。事实上,按照惯例,只有使用箭头运算符调用的那些才会执行->;使用-> 调用会隐式发送一个引用该对象的特殊参数。 perl 中的所有函数和方法都以相同的方式声明(使用关键字sub)。只有调用才能确定函数是否为方法。
my ($foo, $bar) = ( $x, $y ); 称为并行赋值。这就是这里发生的一切!
观察一个哈希可以从 Perl 中的数组初始化。
my @foo = qw/ foo bar baz quz /;
my %hash = @foo;
print $hash{foo}; # outputs bar
因为您分配给哈希%myInputs,所以哈希被显式分配所有不是隐式发送的输入(因为您将那个输入拉到$self)。但是要小心,做以下正确的事情没有多大意义?
my @foo = qw/ foo bar baz /;
my %hash = @foo;
print $hash{baz} # what is this set too??
出于同样的原因,使用不均匀数量的参数调用您的函数也没有多大意义!两者都会产生警告。
【讨论】:
$self 指的是您正在调用的对象。如果您调用my $a Animal->new,然后调用$a->run,那么sub run {} 内部的$self(第一个参数)将设置为$a。在其他语言中,您称之为this。如果你习惯了,你也可以在 Perl 中称它为 $this,my $this = shift(尽管它违反惯例)。
在 Perl 中@_; 是一个全局数组特殊变量
类似于@ARGV 该数组包含用于脚本的命令行参数。
所以在my ($self, %myInputs) = @_;
@_ 表示散列变量% 中变量$ 的参数
【讨论】: