アプリ版:「スタンプのみでお礼する」機能のリリースについて

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です。原因がわからず先に進めない状況です。指導お願い致します。

A 回答 (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];
}
でもいい.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考書は入門Perl for beginners という本で対応しているバージョンは5.003らしいです。平成9年に書かれています。

教えて頂いたプログラムで少しやってみます。
ありがとうございました。

お礼日時:2011/12/26 12:52

ああそうだ, ついでなのでちょっと perldelta を確認してみました.



まず, 「スカラーコンテキスト及び void コンテキストの split が @_ を変更しない」ようになったのは 5.14.0 です. このうち, 「void コンテキストの split」については 5.12.0 の段階で警告が出るようになっています (と, perldelta には書いてある). 質問者さんは Perl 5.14 を使っているということなので, 本件については「警告を出すようにしていれば警告が出ているはず」です.

うん, #2 の「とりあえず 5.8 をおさえておけばいい」は (少なくともここについては) 外してるな (苦笑)

今から Perl を学ぶなら, 「常に use strict; use warnings; する」くらいに思った方がいいでしょう. そうしておけば, このプログラムに対して警告が出ます (ついでに strict のために大量のエラーが出ますが).
    • good
    • 0
この回答へのお礼

わざわざ何度もありがとうございます。
先ほど書いて頂いたプログラムを元に試行錯誤した結果なんとかできました。
ありがとうございました。

お礼日時:2011/12/26 13:52

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
> スカラコンテキストでは、見つかったフィールドの数を返します。
(註:配列@_についてまったく述べてない点に注意)

旧版の時点でも「推奨されない」とあるのですから、そのやりかた自体変えた方がよいです

この回答への補足

申し訳ありませんが、どのように表記すればよいか教えていただけませんか?
どこのサイトも詳しく書いておらず、参考書も古いのばかりでよくわからない状態です。

補足日時:2011/12/26 12:31
    • good
    • 0
この回答へのお礼

回答ありがとうございます。確認したところバージョンは5.14でした。
古い参考書を使用してしまったみたいですね。

今のバージョンではどのように表記すればよいか調べてみます。
ありがとうございました。

お礼日時:2011/12/26 12:20

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