perl初心者です。
ファイルからデータを読み込んで3列目の要素を取り出すプログラムを作ろうと思っています。
その途中の勉強段階で参考書に
$,=',';
$\="\n";
@ARRAY=();
while(<>){
chop;
split;
@ARRAY=(@ARRAY, [@_] );
}
print @ARRAY;
foreach (@ARRAY){
print @$_;
}
print $ARRAY[1][2];
というプログラムがありました。このプログラムの大まかな意味は理解できます。
しかし、読み込ませるファイルを
1 2 3
4 5 6
7 8 9
のようにして
コマンドプロンプトで実行してみると
ARRAY(0x198b9c),ARRAY(0x198998),ARRAY(0x19a830)
となり、参考書で紹介される結果の
ARRAY(0x198b9c),ARRAY(0x198998),ARRAY(0x19a830)
1,2,3
4,5,6
7,8,9
6;
となりませんでした。色々調べたんですが、どうやら print @_; に反応(?)してくれてないみたいです。
私の使用しているPCはwindows7です。原因がわからず先に進めない状況です。指導お願い致します。
No.2ベストアンサー
- 回答日時:
ついでにいうと, while ループの最初の chop は chomp にした方がいいと思う. ここで chop を使う理由として唯一思い当たるのは「chomp がない」ということで, そうだとするとその「古い参考書」とやらはバージョン 5より前 (つまり Perl 4.x の時代) か?
もちろん「対応しているバージョン」は「参考書」に書いてあるはずだから調べてほしいんだけど, もし本当に「バージョン 4.x 対応」とあるならそんな「古文書」は見ないことにして「今の Perl 用に参考になるもの」を探すべき. バージョン 5.x であっても 5.8 以前なら同様の対応をお勧めします. 5.8→5.10→5.12→5.14 とちょっとずつ変化してるんだけど, とりあえず 5.8 をおさえておけばいいでしょう.
本題については, たとえば「split の結果を受け取る配列変数を 1個用意する」という方針でもいいし, もっとシンプルに書くなら実は
while (<>) {
chomp;
push @ARRAY, [split];
}
でもいい.
回答ありがとうございます。
参考書は入門Perl for beginners という本で対応しているバージョンは5.003らしいです。平成9年に書かれています。
教えて頂いたプログラムで少しやってみます。
ありがとうございました。
No.3
- 回答日時:
ああそうだ, ついでなのでちょっと perldelta を確認してみました.
まず, 「スカラーコンテキスト及び void コンテキストの split が @_ を変更しない」ようになったのは 5.14.0 です. このうち, 「void コンテキストの split」については 5.12.0 の段階で警告が出るようになっています (と, perldelta には書いてある). 質問者さんは Perl 5.14 を使っているということなので, 本件については「警告を出すようにしていれば警告が出ているはず」です.
うん, #2 の「とりあえず 5.8 をおさえておけばいい」は (少なくともここについては) 外してるな (苦笑)
今から Perl を学ぶなら, 「常に use strict; use warnings; する」くらいに思った方がいいでしょう. そうしておけば, このプログラムに対して警告が出ます (ついでに strict のために大量のエラーが出ますが).
わざわざ何度もありがとうございます。
先ほど書いて頂いたプログラムを元に試行錯誤した結果なんとかできました。
ありがとうございました。
No.1
- 回答日時:
perl のversionは?
splitの結果が@_に入るのは5.12のころまでです
http://perldoc.jp/docs/perl/5.12.1/perlfunc.pod
> スカラコンテキストの場合には、見つかったフィールドの数を返し、 配列 @_ に分割結果を設定します。 しかし、スカラコンテキストでの split の使用は推奨されません。 サブルーチンの引数を上書きしてしまうからです。
5.14では廃止されています。(正確にいつからかは、履歴を確認してください)
http://perldoc.jp/docs/perl/5.14.1/perlfunc.pod
> スカラコンテキストでは、見つかったフィールドの数を返します。
(註:配列@_についてまったく述べてない点に注意)
旧版の時点でも「推奨されない」とあるのですから、そのやりかた自体変えた方がよいです
この回答への補足
申し訳ありませんが、どのように表記すればよいか教えていただけませんか?
どこのサイトも詳しく書いておらず、参考書も古いのばかりでよくわからない状態です。
回答ありがとうございます。確認したところバージョンは5.14でした。
古い参考書を使用してしまったみたいですね。
今のバージョンではどのように表記すればよいか調べてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Can't use string ("0") as an ...
-
サンプルの意味
-
アクティブセルから、A列最終行...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
ハッシュ検索はなぜ速い
-
乱数の桁数指定、または範囲指定。
-
アセンブラによるウェイト(WAIT...
-
VBのReturnの使い方
-
VBA for i=1 to lastrow
-
VBAでの一時停止と再開の方法
-
一意(ユニーク)かつ、ソート...
-
Dim flag(4) as boolean で配列...
-
Excel VBA ユーザーフォームの...
-
alarmの使用について
-
For文を使った九九表の作成
-
Perlは戻り値で、ハッシュや配...
-
「偶数・奇数の和」のフローチ...
-
UWSCの終了の仕方
-
EXCEL VBA(初心者)印刷ルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
PerlでCSV形式のファイルの一部...
-
perlの引数が不安定になります。
-
perlの比較、ループの使い方に...
-
レキシカル変数について
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
データベースでユーザーのパス...
-
VBのReturnの使い方
-
ループ7回目の悪役令嬢は、元敵...
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
エクセルの当番表を作っていま...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
DOSコマンドのループ内のTIMEコ...
おすすめ情報