• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:print文内でのsplice文と代入についてです)

print文内でのsplice文と代入についてのエラーについて

このQ&Aのポイント
  • perlでprint文内でのsplice文と代入を行う際にエラーが発生する問題が生じています。具体的には、配列から要素をspliceで取り出して変数に代入する処理がエラーとなります。
  • エラーが発生するプログラムの原因は、print文の括弧の中で代入とspliceを同時に行おうとしていることです。これにより、正しい文法として解釈されずエラーが発生します。
  • 一方、エラーが発生しないプログラムでは、代入とspliceを別々の行に記述しています。これにより、正しい文法として解釈されエラーが回避されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

Perl には「命令のように見えて実は関数」というものが非常に多かったりします. この print もそうで, print $item , "\n"; という文は実は 2個の値 (からなるリスト) を引数とする関数です. つまり, これは print($item, "\n"); と同じです. これで最初の文を見直すとわかりますが, print ( $item = splice ( @array, 0, 1 ) ) , "\n"; は (print($item = splice(@array, 0, 1))), "\n"; と同じことになります. Useless use of... はこの最後の "\n" について言っています. ということで, 期待する動作は print(($item = splice(@array, 0, 1)), "\n"); とすれば得られます. この辺は, ラクダ本を含むいくつかの文献で触れられているはず.

minoa_
質問者

お礼

回答ありがとうございます。 エラーの原因がよく分かりました。 ラクダ本は今の本を終えたら読もうと思ってます。 ありがとうございました!

その他の回答 (2)

回答No.2

( ) は配列を作る役割もあります。下の例だと配列は@array2 に入ります。 my @array = ('a', 'b', 'c'); my @array2 = (my ($item) = splice @array, 0, 1); 下の例だと( ) で作った配列がどこにも使われていないとperlが判断したんでしょうかね? print (($item) = splice @array, 0, 1), "\n"; エラーについては、コマンドラインで perldoc perldiag で調べられます。全ての警告の説明が出るのでファイルなどに落としてテキストエディタ などで検索して下さい。webでperldiagを検索しても出るでしょう。 処理をくくるのとその戻り値を使う場合は do {} を使えばよいと思います。 print do { ($item) = splice @array, 0, 1 }, "\n";

minoa_
質問者

お礼

なるほど、ありがとうございます。 perldoc perldiagが、とても勉強になりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「エラーになる」のならそのエラーメッセージを読めばいいのでは?

minoa_
質問者

お礼

回答ありがとうございます。 エラーは読んだのですが、英語が苦手なのもあって意味をあまり理解できなかったので、質問しました。 ちなみにエラーは、 print (...) interpreted as function at test.pl line 10. Useless use of a constant in void context at test.pl line 10. と出ましたが、 関数のことと、定数(の意味のない使用?)と書かれている程度しか理解できませんでした・・。 もう少し詳しく理解したいので、分かる方いましたら、教えてください。 引き続きよろしくお願いします。

minoa_
質問者

補足

また、質問文7行目にミスがありました。 3つめの要素 → 1つめの要素 です。すみませんでした。 引き続きよろしくおねがいします。

関連するQ&A