- ベストアンサー
行指向処理でデータの読み込みについて
- perl初心者の質問:ファイルからデータを読み込むプログラムを作成中
- プログラムの結果が予想と異なり、問題が発生している
- print @_; の反応がなく、原因がわからず先に進めない
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ついでにいうと, 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]; } でもいい.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ああそうだ, ついでなのでちょっと perldelta を確認してみました. まず, 「スカラーコンテキスト及び void コンテキストの split が @_ を変更しない」ようになったのは 5.14.0 です. このうち, 「void コンテキストの split」については 5.12.0 の段階で警告が出るようになっています (と, perldelta には書いてある). 質問者さんは Perl 5.14 を使っているということなので, 本件については「警告を出すようにしていれば警告が出ているはず」です. うん, #2 の「とりあえず 5.8 をおさえておけばいい」は (少なくともここについては) 外してるな (苦笑) 今から Perl を学ぶなら, 「常に use strict; use warnings; する」くらいに思った方がいいでしょう. そうしておけば, このプログラムに対して警告が出ます (ついでに strict のために大量のエラーが出ますが).
お礼
わざわざ何度もありがとうございます。 先ほど書いて頂いたプログラムを元に試行錯誤した結果なんとかできました。 ありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
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でした。 古い参考書を使用してしまったみたいですね。 今のバージョンではどのように表記すればよいか調べてみます。 ありがとうございました。
補足
申し訳ありませんが、どのように表記すればよいか教えていただけませんか? どこのサイトも詳しく書いておらず、参考書も古いのばかりでよくわからない状態です。
お礼
回答ありがとうございます。 参考書は入門Perl for beginners という本で対応しているバージョンは5.003らしいです。平成9年に書かれています。 教えて頂いたプログラムで少しやってみます。 ありがとうございました。