在我的工作中,我在代码库中遇到了许多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 '<'.$_.'>', @_;
}
}
Run Code Online (Sandbox Code Playgroud)
暂且不谈这些子程序的意图(我不完全确定自己......),"参数列表"位置的字符序列是什么意思?即 的$$$
,$$;$$
并且$$@
序列在这些实施例.
我有Perl的了解非常有限,但我认为,my($a,$b,$m)=@_;
在第一个例子(行sum
)解包传递给子程序到的参数$a
,$b
和$m
局部变量.这表明它$$$
表示了arity和类型签名sum
(在这种情况下它需要三个标量).这可能表明gOut
需要两个标量和一个数组.这是正确的解释吗?
即使上面的解释是正确的,我也在第二个例程(gNode
)中失去了分号的含义.
Sin*_*nür 15
请参阅Prototypes上的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
Run Code Online (Sandbox Code Playgroud)
不要忘记:当然,这一切都非常强大,应该只在适度时使用才能让世界变得更美好.
归档时间: |
|
查看次数: |
4467 次 |
最近记录: |