11

ソースコードを閲覧しているときに、次の行を見ました。

my @files_to_keep = qw (file1 file2);
my %keep = map { + $_ => 1 } @files_to_keep;

+このコード スニペットで は何をしますか? Data::Dumperプラス記号を取り除いても何かが起こるかどうかを確認していましたが、結果は同じでした:

  $ perl cleanme.pl
$VAR1 = {
          'file1' => 1,
          'file2' => 1
        };
4

2 に答える 2

13

これは、解析の問題を防ぐために使用されます。プラス記号は、インタープリターが式ではなく通常のブロックのように動作するように強制します。

恐れているのは、おそらく、そのような他の (式) 公式を使用してハッシュ参照を作成しようとしているというmapことです。

@array_of_hashrefs = map {  "\L$_" => 1  }, @array

コンマに注意してください。次に、パーサーが、OP のステートメントを指定してこれを行っていると推測すると、コンマがないという構文エラーが発生します。違いを確認するには、引用してみてください"$_"。何らかの理由で、パーサーはこれを式の動作をトリガーするのに十分であると見なします。

はい、それは奇妙です。したがって、多くの非常に偏執的な Perl プログラマーは、余分なプラス記号を必要以上に頻繁に使用します (私も含めて)。

ドキュメントの例を次に示しmapます。

%hash = map {  "\L$_" => 1  } @array  # perl guesses EXPR.  wrong
%hash = map { +"\L$_" => 1  } @array  # perl guesses BLOCK. right
%hash = map { ("\L$_" => 1) } @array  # this also works
%hash = map {  lc($_) => 1  } @array  # as does this.
%hash = map +( lc($_) => 1 ), @array  # this is EXPR and works!
%hash = map  ( lc($_), 1 ),   @array  # evaluates to (1, @array)

(文体的に) 楽しい読み物と、パーサーが間違っている場合については、http: //blogs.perl.org/users/tom_wyant/2012/01/the-case-of-the-overloaded-curlys.htmlを読んでください。

于 2013-03-07T17:08:25.073 に答える
8

単項プラス演算子は、オペランドを変更せずに返すだけです。1つ追加しても、コンテキストは変更されません。

あなたが与えた例では、それは完全に役に立たない。ただし、次のトークンを間違いなく演算子にすることが役立つ場合があります。


たとえば、にmapは2つの構文があります。

map EXPR, LIST

map BLOCK LIST

ブロックはで始まります{が、式も同様です。たとえば{ }、ブロックまたはハッシュコンストラクターにすることができます。

では、どうすればmap違いがわかりますか?推測します。それは時々間違っていることを意味します。

推測が間違っている1つの機会は、次のとおりです。

map { $_ => 1 }, @list

+またはを使用して正しく推測することができます;

map {; ...     # BLOCK
map +{ ...     # EXPR

したがって、この場合、

map +{ foo => $_ }, @list

次のものも使用できることに注意してください。

map({ foo => $_ }, @list)

もう1つの例は、引数の周りのパレンを省略し、最初の引数式がパレンで始まる場合です。

print ($x+$y)*2;    # Same as: 2 * print($x+$y)

を使用して修正できます

print +($x+$y)*2;

しかし、なぜ親を避けるためだけにハックを重ねるのですか?私は好きです

print(($x+$y)*2);
于 2013-03-07T17:25:06.143 に答える