2013-08-02 19 views
9

自分の仕事でコードベースに数多くのPerlスクリプトがあります。そのうちのいくつかは、次の構文の風変わりでサブルーチンが含まれています。Perlパラメータリストのドル、アットマーク、セミコロンの文字はどういう意味ですか?

sub sum($$$) { 
    my($a,$b,$m)[email protected]_; 
    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([email protected]) { 
    my $h = shift; 
    my $i = shift; 
    if ($i > 0) { 
     print $h (('')x$i, map '<'.$_.'>', @_); 
    } else { 
     print $h map '<'.$_.'>', @_; 
    } 
} 

これらのサブルーチンを行うことを意図しているかの質問(私は自分自身全くわからないが...)ともかく、中の文字のシーケンスを何「パラメータリスト」の位置はどういう意味ですか? Viz。これらの実施例では$$$,$$;$$および[email protected]の配列を含む。

私は、Perlの非常に限られた理解しているが、私は最初の例(sum)でmy($a,$b,$m)[email protected]_;ラインが$a$b$mローカル変数にサブルーチンに渡されたパラメータをアンパックと信じています。これは、$$$がアリティーとタイプシグニチャーであるsumを示していることを示しています(この場合、3つのスカラーが必要です)。これは、おそらくgOutが2つのスカラーと配列を必要とすることを示唆します。これは正しい解釈ですか?

上記の解釈が正しい場合でも、2番目のルーチン(gNode)のセミコロンの意味が分かりません。

+5

これらの記号は、一般的にコードが本当に彼らが何をしていたか知らなかった誰かによって書かれたことを意味します。 Perlのプロトタイプは、少数のケースで本当に役に立ちます。そしてこれらはそのような場合ではありません。 http://www.perlmonks.org/?node_id=861966を参照してください。 –

+0

前の[コメント]の[Dave Cross](http://stackoverflow.com/users/7231/dave-cross)が参照するPerl Monksノードhttp://stackoverflow.com/questions/18006898/what-do-dollar-at-sign-and-semicolon-characters-in-perl-parameter-lists-mean#comment26344863_18006898)は、あなたが今までにしたこと以上のものですPerlの プロトタイプについて知りたい](http://www.perlmonks.org/?node_id=861966) Perlでプロトタイプを使用しようとする人にとっては必須の読書でなければなりません。あなたはそれを読んだ後でPerlでプロトタイプを使うつもりはないので、一度だけ読む必要があります。 –

答えて

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 ([email protected])  myjoin ":", $a, $b, $c 
sub mypop (+)   mypop @array 
sub mysplice ([email protected]) 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 

は忘れないでください: これは、もちろん、すべての非常に強力であり、そして世界をより良い場所にするという目的に限って使用すべきです。

+2

+1は力と責任を思い出させる – pilcrow

0

私は残りの部分に同意します:あなたが何をしているのか分からない限り、サブプロトタイプは使用しないでください。 「大きな力をもって大きな責任を負う」 Cプロトタイプに慣れた人が作成したようです。例えば、サブsumは本当にこのプロトタイプを持っている必要があります。

sub sum (\$\$\$) { 
関連する問題