![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) Pythonのライブラリ、randomについて 3 2022/09/20 14:30
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- TOEFL・TOEIC・英語検定 英語 文法 1 2023/02/27 14:01
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
組み合わせを作るアルゴリズム
-
DoEventsが必要な理由について
-
GIFアニメをループさせたくない
-
VBAでの一時停止と再開の方法
-
UWSCに制限時間を付けたいです
-
perlで配列の要素が空なのを知...
-
Perl 文字列を配列に直す方法
-
VB.NETで素因数分解のプログラ...
-
Escキーを押すと、中断する時と...
-
流れ図(フローチャート)が分か...
-
Javaの質問です。 この問題の答...
-
C#の勉強を始めたばかりの者です。
-
.htaccessがループしてる?それ...
-
二次元配列における要素数のは...
-
WinAPI「MsgWaitForMultipleObj...
-
エクセルの当番表を作っていま...
-
UWSCの終了の仕方
-
perl 初等プログラミングについて
-
VBのReturnの使い方
-
HTML::Parserの解析結果
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
index関数で複数個抜き出す
-
perlで2つの配列を比較する方...
-
perlでファイルの拡張子を除い...
-
桁数指定と四捨五入
-
[Perl]長すぎるif文を簡単にしたい
-
grep関数を用いた複数行からの抽出
-
配列やハッシュで中身が同じか...
-
組み合わせを作るアルゴリズム
-
複数の配列の要素を繰り返し処...
-
正規表現に関する質問
-
データベースから取得したデー...
-
ソート時同じ値がある場合、表...
-
非共通要素を抜き出す
-
C言語の関数ポインタのイメージ...
-
Perl 戻り値の型の判定って出来...
-
配列に入った変数を二度使いたい
-
QNo.3258883データベースから取...
-
ループ中でのmy宣言と処理速度
-
print文内でのsplice文と代入に...
-
リファレンスを使った方法を教...
おすすめ情報