こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

Perl初心者です。
test.txtというファイルがあって、その中の1行目から3行目までを
出力したい場合はどうしたらいいでしょうか?

open(FILE,"test.txt") || die "Open Error.\n";
@data = <FILE>;
close(FILE);

foreach (@data) {
print $_;
}
これだと、ファイルの中身が全て出力されてしまいます。

投稿日時 - 2007-01-22 16:35:30

QNo.2686945

困ってます

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

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

投稿日時 - 2007-01-22 16:55:07

お礼

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

投稿日時 - 2007-01-22 18:53:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

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

投稿日時 - 2007-01-23 13:28:31

お礼

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

投稿日時 - 2007-01-25 09:03:12

ANo.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;

投稿日時 - 2007-01-22 18:00:41

お礼

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

投稿日時 - 2007-01-22 18:56:51

ANo.5

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

投稿日時 - 2007-01-22 16:55:31

お礼

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

投稿日時 - 2007-01-22 18:54:58

ANo.3

foreach (@data) {
print $_;
}

の部分を

for ($i=0 ; $i<3 ; $i++) {
print $data[$i] ;
}

かな。

投稿日時 - 2007-01-22 16:49:41

お礼

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

投稿日時 - 2007-01-22 18:51:54

ANo.2

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

http://okwave.jp/qa2645307.html

投稿日時 - 2007-01-22 16:49:04

お礼

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

投稿日時 - 2007-01-22 18:49:53

ANo.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 $_;
}

投稿日時 - 2007-01-22 16:48:27

お礼

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

投稿日時 - 2007-01-22 18:48:11

あなたにオススメの質問