プロが教える店舗&オフィスのセキュリティ対策術

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

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

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

A 回答 (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文を使って同じことをしてみるのも勉強になると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/22 18:53

open(FILE, "test.txt");


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

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

お礼日時:2007/01/25 09:03

ファイルを一度に全部読む必要はあるのでしょうか?



これまでの回答にもある通り、何行出力したかを
数えておけばいいだけの話なんですが、こういうやり方も
あるよということで。

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;
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/01/22 18:56

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/22 18:54

foreach (@data) {


print $_;
}

の部分を

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

かな。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/22 18:51

同じくPerl初心者です。


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

http://okwave.jp/qa2645307.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/22 18:49

単純にカウンタいれればいいのでは。


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

my $count;
$count=0;
foreach (@data) {
last if($count==3);
$count++;
print $_;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/22 18:48

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