
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言語とかでは同じ意味だったので特に……。)
なぜ上はエラーで、下はエラーでないのかの理由を、分かる方ぜひ教えてください。
よろしくお願い致します。
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");
とすれば得られます.
この辺は, ラクダ本を含むいくつかの文献で触れられているはず.
回答ありがとうございます。
エラーの原因がよく分かりました。
ラクダ本は今の本を終えたら読もうと思ってます。
ありがとうございました!
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";
No.1
- 回答日時:
「エラーになる」のならそのエラーメッセージを読めばいいのでは?
この回答への補足
また、質問文7行目にミスがありました。
3つめの要素 → 1つめの要素
です。すみませんでした。
引き続きよろしくおねがいします。
回答ありがとうございます。
エラーは読んだのですが、英語が苦手なのもあって意味をあまり理解できなかったので、質問しました。
ちなみにエラーは、
print (...) interpreted as function at test.pl line 10.
Useless use of a constant in void context at test.pl line 10.
と出ましたが、
関数のことと、定数(の意味のない使用?)と書かれている程度しか理解できませんでした・・。
もう少し詳しく理解したいので、分かる方いましたら、教えてください。
引き続きよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlで2つの配列を比較する方...
-
python質問
-
桁数指定と四捨五入
-
[Perl]長すぎるif文を簡単にしたい
-
DBIを使ってのデータの取り出し...
-
perlでファイルの拡張子を除い...
-
print文内でのsplice文と代入に...
-
ソート時同じ値がある場合、表...
-
visual basic 2015で文字列の1...
-
配列内定義サブルーチン呼び出し
-
Perlについて教えてください!
-
index関数で複数個抜き出す
-
ループ中でのmy宣言と処理速度
-
二次元配列のつかいかた。
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
おすすめ情報