dポイントプレゼントキャンペーン実施中!

print文内でのsplice文と代入についてです

perlを最近勉強し始めたのですが、
print文中で、spliceと代入を行ったところ、エラーになってしまいました…。

具体的には、以下のプログラムで
(array配列から、3つめの要素をspliceで取り出して$itemへ代入するプログラムです)

use strict;
use warnings;

my @array = ('a', 'b', 'c');
my $item;

この後で、
print ( $item = splice ( @array, 0, 1 ) ) , "\n";
と書くとエラーになります……。が、

$item = splice ( @array, 0, 1 );
print $item , "\n";
この文ならエラーになりませんでした。

この2つの違いが分からなくて困ってます。
(C言語とかでは同じ意味だったので特に……。)

なぜ上はエラーで、下はエラーでないのかの理由を、分かる方ぜひ教えてください。
よろしくお願い致します。

A 回答 (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");
とすれば得られます.
この辺は, ラクダ本を含むいくつかの文献で触れられているはず.
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/12 21:29

( ) は配列を作る役割もあります。

下の例だと配列は@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";
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/12 21:28

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

この回答への補足

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

補足日時:2010/07/12 00:41
    • good
    • 0
この回答へのお礼

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

もう少し詳しく理解したいので、分かる方いましたら、教えてください。
引き続きよろしくお願いします。

お礼日時:2010/07/12 00:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!