2017-02-16 10 views
1

は、私はちょうど+オペレータとPerlで配列を連結しようとした奇妙な結果を得た:ハッシュと同じことをなぜPerlの連結配列が数値を生成するのですか?

perl -wE 'say([1, 2, 3] + [4, 5, 6])' 
73464360 

は、構文エラーのようだ:結果は何

perl -wE 'say({} + {})' 
syntax error at -e line 1, near "} +" 
Execution of -e aborted due to compilation errors. 

最初の式は?それはどこに文書化されていますか?

+3

あなたはそれがうまくいくと思いましたか? –

+2

1回目のコマンドを何度も実行します。別の結果が得られますか? – toolic

+0

@マーク:私のPythonの習慣... – planetp

答えて

7

参照のメモリアドレスを生成するのは、参照の番号付けからのものです。

perl -E 'say \@a; say 0+\@a; printf "%x\n",0+\@a' 

典型的な出力(それはあなたがプログラムを実行するたびに変更するかもしれませんが)

ARRAY(0x1470518) 
21431576 
1470518  <--- same number as in first line 

あなたのハッシュリファレンスの例はほとんど動作しますが、Perlのように{}ブロックの最初のセットを解析しているようですハッシュリファレンスとしてではなく、コードブロックです。単項の+を使用して、Perlにハッシュ参照として扱わせると、それは機能します。私は "仕事"を意味します。

perl -E 'say(+{} + {})' 
40007168 
+4

アイ'say {{{{}}' '(' '{'}} ''を実行するための '' BLOCK LIST'構文を使っていると思います。 – ikegami

3

Perlの+は算術演算子であるためです。その議論は何に関係なく数字として解釈されます。そのため、Perlには文字列連結のための別の演算子があります(.)。

効果的には、配列が格納されているアドレスを追加することです。

アレイの連結は、アレイを順番に並べることによって行われます。あなたはアレイ([ ... ])への参照を使用している場合は、あなたは@{ ... }で最初にそれらを間接参照する必要があります。

perl -wE 'say(@{[1,2,3]}, @{[4,5,6]})' 

しかし、通常、あなたは余分に必要とする配列変数を使用していないでしょう構文。

perl -wE 'my @a = (1,2,3); my @b = (4,5,6); say join("-",@a,@b)' 
#=> 1-2-3-4-5-6 

同じことがハッシュになります。 my %c = (%a,%b);%a%bの内容を組み合わせて(その順番で、%bの共通キーの値は%aの値を新しいハッシュ%cに上書きします)。参照で同じことを行うにはmy $c = { %$a, %$b };を使うことができます。 +の試行で実行中の問題は、{}は空のハッシュではなく空のブロックとして解釈される可能性があります。

関連する問題