在我的工作中,我在代码库中遇到过许多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
,{ {1}}和$b
个局部变量。这表明$m
表示$$$
的arity和类型签名(在这种情况下,它预计有三个标量)。这可能表明sum
需要两个标量和一个数组。这是正确的解释吗?
即使上面的解释是正确的,我也不知道第二个例程(gOut
)中分号的含义。
答案 0 :(得分:15)
请参阅原型上的perldoc perlsub条目。
# Declared as Called as
sub mylink ($$) mylink $old, $new
sub myvec ($$$) myvec $var, $offset, 1
sub myindex ($$;$) myindex &getstring, "substr"
sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $off
sub myreverse (@) myreverse $a, $b, $c
sub myjoin ($@) myjoin ":", $a, $b, $c
sub mypop (+) mypop @array
sub mysplice (+$$@) mysplice @array, 0, 2, @pushme
sub mykeys (+) mykeys %{$hashref}
sub myopen (*;$) myopen HANDLE, $name
sub mypipe (**) mypipe READHANDLE, WRITEHANDLE
sub mygrep (&@) mygrep { /foo/ } $a, $b, $c
sub myrand (;$) myrand 42
sub mytime () mytime
不要忘记: 当然,这一切都非常强大,只应在审核中使用才能让世界变得更美好。
答案 1 :(得分:0)
我同意其余部分:除非你知道你在做什么,否则不要使用子原型。 “强大的力量带来了巨大的责任。”看起来他们是由一个习惯于C原型的人创造的。例如,子sum
确实应该有这个原型:
sub sum (\$\$\$) {