perldoc
「スカラーコンテキストでのリスト割り当ては、リスト割り当ての右側にある要素の数を返します」と言いますが、このコードを試してみると、次のようになります。
perl -e '$_="aaaaa";print $v=(()=split //)'
出力は1
私を混乱させるものです。(私が期待する答えはです5
。)
誰かがこれを説明できますか?
perldoc
「スカラーコンテキストでのリスト割り当ては、リスト割り当ての右側にある要素の数を返します」と言いますが、このコードを試してみると、次のようになります。
perl -e '$_="aaaaa";print $v=(()=split //)'
出力は1
私を混乱させるものです。(私が期待する答えはです5
。)
誰かがこれを説明できますか?
ドキュメントによるとsplit
:
リストに割り当てるときに、LIMITが省略されているか、ゼロの場合、Perlはリスト内の変数の数より1大きいLIMITを提供します<...>
空のリストを指定したため、split
返される結果は1つだけであり、この数の結果が正確に変数で終了します。
split
ある種のクレイジーなウルトラマジックがあり、左側にリストがある割り当ての右側にあることを認識し、そのリスト内のアイテムの数に応じて動作を調整できます。
これはperlfunc
「不要な作業を回避するために」行われると説明されていますが、その最適化によって引き起こされる動作に目に見える違いが見られます。
何が起こったかの証拠を確認するには、次のようにDeparseを介してスクリプトを実行します。
perl -MO=Deparse -e '$_="aaaaa";print $v=(()=split //)'
更新:これを実装するコードを探しに行きましたが、期待した場所ではありませんでした。実際、最適化は代入演算子(op.c:Perl_newASSIGNOP
)によって実行されます。splitはそのコンテキストについてあまり知りません。
空の配列に割り当てるのはなぜですか?()=(split //)
ビット。それは結局-ええと、まあ、混乱になります。または、あなたの場合、サイズが1で、あまり含まれていない配列です。
また、それは過度にあいまいです。perlは書き込み専用であるという悲しい評判があり、$ _を変更してそれを使用しても、他の人(またはあなた)が何が起こっているのかを理解するのに役立ちません。
次のようなものを試してください
perl -e '$v = (split //, "aaaaa"); print "$v\n"'
または、テストの動作を再現したい場合:
perl -e '$v = () = (split //, "aaaaa"); print "$v\n"'
はい、でも :
perl -e '$_="aaaaa";print $v=(split //)'
5を与えるだけでなく
perl -e '$_="aaaaa";print $v=(@x=split //)'
たぶんあなたの左の値()は追加の配列要素を落としていますか?
編集:ちなみに:
perl -e '$_="aaaaa";print $v=(($x,$y)=split //)'
$ v = ...コマンドを正しく表示すると、3が返されます。
($ x、$ y、(a、a、a))
したがって、元のケースで()=split //
は、((a、a、a、a、a))(要素が1つしかない)を返します。
編集:配列表記が正しくありません。テストケースが最後に変更されたため、結果が間違っていました。