我在我的工作中遇到了一些代码库中的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
不要忘记:这当然是非常强大的,应该只适用于使世界变得更美好.