- ベストアンサー
ファイルの3行目までを出力したい
Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
@dataというのは配列で、1つの要素が1行になっています。 つまり、 foreach 1周目: $_ → $data[0] … 1行目 foreach 2周目: $_ → $data[1] … 2行目 foreach 3周目: $_ → $data[2] … 3行目 foreach 4周目: $_ → $data[3] … 4行目 というわけです。 やりかたはいくつかありますが、今後のことを考えると 新しくスカラー型の変数を用意してforeach内部のループ回数を数えるようにすると 勉強になると思います。 $count = 0; foreach (@data) { print $_; # * count増加 # * countが3になったらループを抜ける } for文を使って同じことをしてみるのも勉強になると思います。
その他の回答 (6)
- Tacosan
- ベストアンサー率23% (3656/15482)
open(FILE, "test.txt"); while (<FILE>) { print if 1 .. 3; } 範囲演算子をスカラーコンテキストで評価すると「それなりに」行との比較が行われます. 整定数の場合は行番号との比較, パターンマッチングならその行でマッチするかどうかをします.
お礼
Perlは、さまざまな書き方があるので、 自分が一番理解しやすい文法で書こうと思いました。 ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
ファイルを一度に全部読む必要はあるのでしょうか? これまでの回答にもある通り、何行出力したかを 数えておけばいいだけの話なんですが、こういうやり方も あるよということで。 use strict; use warnings; use English; open my $fh, '<', 'test.txt' or die "open error: $!"; while (my $line = <$fh>) { last if eof $fh or $INPUT_LINE_NUMBER > 3; print $line; } close $fh;
お礼
行頭から3行目までのuseの部分は今まで使ったことがありません。 モジュールを呼び出してるのでしょうか?! それらのモジュールを呼び出しているから、 $INPUT_LINE_NUMBER には、行数が入っていると判断しました。
- stiffels
- ベストアンサー率34% (25/72)
3番の方のようにfor文でやる場合は配列が3行以下の場合に注意ですよ、
お礼
どのように注意をしたらいいのでしょうか? 3番の方のやり方で、うまく表示できたのですが。。。
- fake-tang
- ベストアンサー率24% (186/772)
foreach (@data) { print $_; } の部分を for ($i=0 ; $i<3 ; $i++) { print $data[$i] ; } かな。
お礼
$data[$i]で、@dataを一行ずつ取り出せるのですね。 配列の理解が足りなかったようです。
- ma_san
- ベストアンサー率33% (19/56)
同じくPerl初心者です。 また頼りになる人たちが答えてくれるとは思うんだけど、 前に私がした質問と似てるところがあるので、参考になればと。 http://okwave.jp/qa2645307.html
お礼
リンク先を拝見しました。 参考にしてみます。
- stiffels
- ベストアンサー率34% (25/72)
単純にカウンタいれればいいのでは。 open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); my $count; $count=0; foreach (@data) { last if($count==3); $count++; print $_; }
お礼
foreach文の中にカウンタを入れて、 カウンタが3になれば、foreach文を抜ける方法ですね。 ありがとうございます。
お礼
すごくわかりやすいです! 配列の使い方、foreach文の使い方がよくわかりました!