在我的工作中,我在代码库中遇到了许多 Perl 脚本。其中一些包含具有以下语法奇怪的子例程:
sub sum($$$) {
my($a,$b,$m)=@_;
for my $i (0..$m) {
$$a[$i] += $$b[$i] if $$b[$i] > 0;
}
}
sub gNode($$;$$) {
my($n,$l,$s,$d) = @_;
return (
"Node name='$n' label='$l' descr='$d'" ,
$s ? ("Shape type='$s' /") : (),
'/Node'
);
}
sub gOut($$@) {
my $h = shift;
my $i = shift;
if ($i > 0) {
print $h (('')x$i, map '<'.$_.'>', @_);
} else {
print $h map '<'.$_.'>', @_;
}
}
撇开这些子例程的用途不谈(我自己也不完全确定……),“参数列表”位置中的字符序列是什么意思?即。$$$
这些示例中的$$;$$
和$$@
序列。
我对 Perl 的了解非常有限,但我相信my($a,$b,$m)=@_;
第一个示例 ( sum
) 中的行将传递给子例程的参数解包到$a
,$b
和$m
局部变量中。这表明$$$
表示 arity 和类型签名sum
(在这种情况下,它需要三个标量)。这可能表明gOut
需要两个标量和一个数组。这是正确的解释吗?
即使上述解释是正确的,我也不知道第二个例程(gNode
)中分号的含义。