在我的工作中,我在代码库中遇到了许多 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)中分号的含义。