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

Pet*_*ter 9 parameters perl

在我的工作中,我在代码库中遇到了许多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)

不要忘记:当然,这一切都非常强大,应该只在适度时使用才能让世界变得更美好.

  • +1提醒权力和责任 (2认同)