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

时间:2013-08-02 00:31:07

标签: 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' 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)中分号的含义。

2 个答案:

答案 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 (\$\$\$) {