我在我的工作中遇到了一些代码库中的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的理解非常有限,但我相信我的($a,$m)= @ _;第一个例子中的行(sum)将传递给子例程的参数解包到$a,$b和$m局部变量中.这表明$$$表示sum的类型和类型签名(在这种情况下,它需要三个标量).这可能表明gOut需要两个标量和一个数组.这是正确的解释吗?
即使上面的解释是正确的,我在第二个例程(gNode)中的分号的意思也没有了.
解决方法
参见
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,length($buf) - $off,$off
sub myreverse (@) myreverse $a,$c
sub myjoin ($@) myjoin ":",$a,$c
sub mypop (+) mypop @array
sub mysplice (+$$@) mysplice @array,2,@pushme
sub mykeys (+) mykeys %{$hashref}
sub myopen (*;$) myopen HANDLE,$name
sub mypipe (**) mypipe READHANDLE,WRITEHANDLE
sub mygrep (&@) mygrep { /foo/ } $a,$c
sub myrand (;$) myrand 42
sub mytime () mytime
不要忘记:这当然是非常强大的,应该只适用于使世界变得更美好.
