2017-06-28 3 views
3

リストから要素をスライスするとリストが返されないのはなぜですか?スカラーコンテキストでリストを操作するときは、最後の要素が返され

@l = qw/ a b c d /; 
print scalar (1, @l); # prints 4 

リストの最後の要素は@lである、スカラーコンテキストでその長さは、だから、最後の要素は@lある4

です。

私がスライスをするとき、なぜこの要素が得られないのですか?

print ((1, @l)[1]); # prints 'a'. expect: abcd 

PS。たぶん私は質問する必要があります:最初の例で平らげが起こらないのはなぜですか?

答えて

6

それは理由リストとスカラーコンテキスト、およびscalarオペレータなくサブルーチン呼び出しであるという事実との動作の違いのためです。 scalarは1つのオペランドしか取ることができないので、複数のパラメータを渡すと、それらはスカラーコンテキストになります。これは、パラメータが常にリストコンテキスト内にある通常のサブルーチン呼び出しとは異なります。

のスカラーコンテキストカンマ演算子は、その左辺オペランドを評価して破棄し、次にその右辺オペランドを評価します。したがって、scalar(1, @l)1を評価して破棄し、@lを評価します。あなたが言うように@lは、4つの要素

リストのスライスを持っている、当然、リストコンテキストを課し、およびリストコンテキストをカンマでリストの要素や配列やハッシュを分離が平坦化されているので、それは4です。pushようa

Perlの配列演算子と同じように振る舞うpopある(1, qw/ a b c d /)[1]よう(1, @l)[1]は同じです。 push @l, 1は、通常のサブルーチンと同じように動作し、push 'a', 'b', 'c', 'd', 1に拡張されている場合はあまり役に立ちません。

+0

>リストスライスはリストコンテキストを強制します。ありがとうございました –

4

最初の例では、scalarを使用してスカラーコンテキストを強制します。
スカラー量,は、スカラーバイナリー演算子が右辺の引数を返すと解釈されます。スカラー文脈で解釈されるべき

@l = qw/ a b c d /; 
@m = (1, @l); # (1,@l) is interpreted in list context 
print scalar(@l); # prints 4 
print scalar(@m); # prints 5 
print scalar('a',@l); # ('a',@l) is interpreted in scalar context 
         # prints scalar(@l) 
print scalar(@l,'a'); # (@l,'a') is interpreted in scalar context 
         # prints a 

perldoc -f scalar

スカラEXPR
強制EXPRとEXPRの値を返します。

man perlop

コンマ演算子
バイナリ "" コンマ演算子です。 スカラーコンテキストでは、左引数である を評価し、その値をスローした後、右辺の 引数を評価し、その値を返します。これはCのカンマ演算子と似ています。
リストコンテキストでは、それはリスト引数の区切り記号に過ぎず、その引数の両方をリストに挿入します( )。これらの引数は、左から右へ と評価されます。

関連する問題