Perl参数列表中的美元、at符号和分号字符是什么意思?

Perl参数列表中的美元、at符号和分号字符是什么意思?,perl,parameters,Perl,Parameters,在我的工作中,我在代码库中遇到了许多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' labe

在我的工作中,我在代码库中遇到了许多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 '<'.$_.'>', @_;
    }
}
小计($$){
我的($a,$b,$m)=@;
对于我的$i(0..$m){
$$a[$i]+=$$b[$i]如果$$b[$i]>0;
}
}
子gNode($$;$$){
我的($n,$l,$s,$d)=;
返回(
“节点名称='$n'标签='$l'描述='$d'”,
$s?(“形状类型='$s'/”):(),
“/Node”
);
}
亚痛风($$@){
我的$h=班次;
我的$i=班次;
如果($i>0){
打印$h((“”)x$i,地图“”,@41;;
}否则{
打印$h地图“”,@;
}
}
撇开这些子程序的作用不谈(我自己也不完全确定……),在“参数列表”位置的字符序列意味着什么?即。
$$
$$$$
$$@
序列

我对Perl的理解非常有限,但我相信
my($a,$b,$m)=@行(
sum
)将传递给子例程的参数解压到
$a
$b
$m
局部变量中。这表明
$$
表示
和的算术和类型签名(在本例中,它需要三个标量)。这可能意味着
gOut
需要两个标量和一个数组。这是正确的解释吗

即使上述解释是正确的,我也不知道第二个例程(
gNode
)中分号的含义。

参见原型条目


别忘了:这当然是非常强大的,应该适度使用,让世界变得更美好。我同意其他观点:除非你知道自己在做什么,否则不要使用子原型。“强大的力量带来巨大的责任。”这些看起来像是由习惯于C原型的人创建的。例如,sub
sum
确实应该具有以下原型:

sub sum (\$\$\$) {

这些符号通常意味着代码是由不知道自己在做什么的人编写的。Perl原型只在少数情况下真正有用。而这些都不是这些案例中的任何一个。请参阅前面is中引用的Perl节点。对于计划在Perl中使用原型的人来说,这应该是必读的。您只需要阅读一次,因为您不打算在阅读后使用Perl中的原型。
sub sum (\$\$\$) {