2013-10-14 8 views
8

私が使用しているPerlツールに対するベンダー提供のパッチを検討していますが、サブルーチンに渡されたパラメータに「@」があらかじめ保留されている特定のタイプの変更の理由を特定するのは苦労しています。例えばPerlの 'at'(@@)の二重の意味は何ですか?

、だっライン:

my ($genfd) = @_; 

は今:

my ($genfd) = @@_; 

は、Perl開発されていない、私はここに行くに勉強していますが、これまでのところ、私understand that '@_'があります囲みサブルーチンに供給されるパラメータ。

I also understand(「$のgenfd」は左側の括弧に包まれている)は、上記割り当てがリストに「@_」キャストし、そのリストの最初の要素に「genfd」スカラ変数を割り当てます。これにより、サブルーチンへの最初のパラメータが 'genfd'に格納されます。

私が完全に執着しているのは、2番目の「@」の違いです。私はfound examples of this usage on GitHubを持っていますが、決して解説はありませんし、Perlの参考文献やSOの説明も見つけられません。どんな助けでも大歓迎です。

答えて

18

悪いパッチのようです。

@@_は構文エラーです。少なくとも、私は次のPerlソースファイルがある場合:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub foo { 
    my ($genfd) = @@_; 
} 

は(Perlの5.14.2で)その上perl -cwを実行しているを与える:

Bareword found where operator expected at tmp.pl line 7, near "@@_" 
     (Missing operator before _?) 
syntax error at tmp.pl line 7, near "@@_" 
tmp.pl had compilation errors. 

私はGitHubの上のすべての例で見ていませんしかし、それらの多くはファイル内に,vという接尾辞が付いています。その接尾辞は、RCSとCVSが内部バージョン管理ファイルとして使用します。私は@の文字には特別な意味があると思うので、文字は@という文字を表すために倍になっています。 (はい、GitリポジトリにRCSやCVSの内部ファイルを持っているのはちょっと奇妙です。)

RCSやCVSのやりとりの中には、エラーの原因として考えられるものがありますが、その他の原因が考えられます。

パッチを提供した人に尋ねる必要があります。

+0

(ほとんどのvファイルは、人のドライブのバックアップであるreposに表示されます) – ikegami

+0

ありがとう@キース!既存のファイルの '、v'履歴のいくつかを見ると、同じ構文が表示されます。このパッチは、RCS/CVSにパッチや新しいバージョンとして渡すことを意味する組み込みトリッキーを使って適用され、逃げ道を削ぎ取っています。 – thisismyrobot

+2

@thisismyrobot:ファイルがRCSまたはCVS内部の '、v'ファイルであることが意図されている場合、' @@ _ 'は完全に有効です。ファイルをチェックすると正しいPerl' @ _ RCSまたはCVSから削除します。 –

関連する問題