- ベストアンサー
スマートな方法でファイルのデータを読み込む方法
- 連続したファイルのデータをスマートに読み込む方法について教えてください。
- ファイルのデータを変数に代入する際にスマートな方法はありますか?
- 効率的で見やすいコードでファイルのデータを読み込む方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
惜しいんですが、配列の参照の仕方が間違っています。例えば、配列@argのindex:2を出力するなら、$arg[2]です。(カッコが必要。) この例なら、 > print qq|<td>$arg_$i</td>|; ではなく、 print qq|<td>$arg_[$i]</td>|; です。 また、$#eqipumentが何者なのかちょっと分かりません。 もし、このままのコードなのでしたら、 foreach my $i (0..$#arg_){ print qq|<td>$arg_[$i]</td>|; } です。 (foreachは()内のリストを順にその前の$i(省略時は$_)に入れていくループですので、$i++とかは不要です。) foreachに慣れていないのならば、forをお使いになったほうがイメージにしっくり来るかもしれません。 for (my $i = 0; $i <= $#arg_; $i++){ print qq|<td>$arg_[$i]</td>|; } ただ、こういう場合はforeachを使ってしまうのがPerl流です。
その他の回答 (1)
- hikomin
- ベストアンサー率63% (40/63)
いろいろあると思いますが、例えば$arg_nとかは配列のような連番になっていますので、本当に配列に入れてしまうとかすると、コード量はぐっと減るかと思います。 ($no,@arg[0..34],$p1,$p2,$p3) = split /<>/;
お礼
hikominさんありがとうございます なるほど、コード量が少なくすみますね @arg_[]の配列に一括りにしてしまうアイデア思いつきませんでした。
補足
お世話になります 質問の補足と、この機会をお借りしてもう少し質問させて下さい。 質問 (1) open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($no,@arg_[0..34],$p1,$p2,$p3) = split /<>/; if ($no == $in{'no'}) { last; } } close(IN); と書けば確かにarg_変数に正しくデータが格納される事は確認いたしました whileの中に其々print qq|<td>$arg_0</td>|; ... print qq|<td>$arg_34</td>|; と書いて確かめましたが これも助長なソースになってしましす、配列に格納して表示するのにスマートな書き方があれば教えていただけないでしょうか 質問 (2) open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($no,@arg_[0..34],$p1,$p2,$p3) = split /<>/; print qq|$no\|; my $i = 0; foreach(0..$#eqipument){ print qq|<td>$arg_$i</td>|; $i++; } if ($no == $in{'no'}) { last; } } close(IN); 自分なりにこんな風に書いてみましたが print qq|<td>$arg_$i</td>|; とすると結果は$iの値だけが出てきます print qq|<td>"\$arg_$i\"</td>|; としても出力は "$i" となり同じ結果になってしまいいます正しく変数の内容を出力するにはどのような書き方をしたら好いでしょうか宜しくお願い致します。
お礼
hikominさんありがとうございます なるほど勉強になりました >するなら、$arg[2]です。(カッコが必要。) print qq|<td>$arg_2</td>|; と書いて変数の内容が出力されたためてっきり、これでいけると勘違いしていました >また、$#eqipumentが何者なのかちょっと分かりません。 実は最初質問した時にarg_$iの変数の$iの値が0~34と書いていましたが実際には @eqipumentという配列でその内容が0~34の即ち35個の事だったんです説明を省くために 定数で表していたのですが、2回目の質問の時にうっかりしていました。 オラリー・ジャパンの「プログラミングPerl 改訂版」を読み直します 本当にありがとうございました。