• ベストアンサー

ファイルの3行目までを出力したい

Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • yukimican
  • ベストアンサー率70% (112/159)
回答No.4

@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文を使って同じことをしてみるのも勉強になると思います。

nana15_3
質問者

お礼

すごくわかりやすいです! 配列の使い方、foreach文の使い方がよくわかりました!

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

open(FILE, "test.txt"); while (<FILE>) { print if 1 .. 3; } 範囲演算子をスカラーコンテキストで評価すると「それなりに」行との比較が行われます. 整定数の場合は行番号との比較, パターンマッチングならその行でマッチするかどうかをします.

nana15_3
質問者

お礼

Perlは、さまざまな書き方があるので、 自分が一番理解しやすい文法で書こうと思いました。 ありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

ファイルを一度に全部読む必要はあるのでしょうか? これまでの回答にもある通り、何行出力したかを 数えておけばいいだけの話なんですが、こういうやり方も あるよということで。 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;

nana15_3
質問者

お礼

行頭から3行目までのuseの部分は今まで使ったことがありません。 モジュールを呼び出してるのでしょうか?! それらのモジュールを呼び出しているから、 $INPUT_LINE_NUMBER には、行数が入っていると判断しました。

  • stiffels
  • ベストアンサー率34% (25/72)
回答No.5

3番の方のようにfor文でやる場合は配列が3行以下の場合に注意ですよ、

nana15_3
質問者

お礼

どのように注意をしたらいいのでしょうか? 3番の方のやり方で、うまく表示できたのですが。。。

  • fake-tang
  • ベストアンサー率24% (186/772)
回答No.3

foreach (@data) { print $_; } の部分を for ($i=0 ; $i<3 ; $i++) { print $data[$i] ; } かな。

nana15_3
質問者

お礼

$data[$i]で、@dataを一行ずつ取り出せるのですね。 配列の理解が足りなかったようです。

  • ma_san
  • ベストアンサー率33% (19/56)
回答No.2

同じくPerl初心者です。 また頼りになる人たちが答えてくれるとは思うんだけど、 前に私がした質問と似てるところがあるので、参考になればと。 http://okwave.jp/qa2645307.html

nana15_3
質問者

お礼

リンク先を拝見しました。 参考にしてみます。

  • stiffels
  • ベストアンサー率34% (25/72)
回答No.1

単純にカウンタいれればいいのでは。 open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); my $count; $count=0; foreach (@data) { last if($count==3); $count++; print $_; }

nana15_3
質問者

お礼

foreach文の中にカウンタを入れて、 カウンタが3になれば、foreach文を抜ける方法ですね。 ありがとうございます。

関連するQ&A