readline

ファイルからレコードをフェッチする

構文

解説

readline は、EXPR に指定したファイルハンドルから行を読み取ります。 EXPR が指定されなければ、*ARGV から読み取ります。 スカラーコンテキスト (戻り値をスカラー変数で受け取る状況) なら、ファイルの最後に到達するまで呼び出すたびに次の行を返します。 そして、ファイルの最後に到達すると undef を返します。

open my $fh, '<', './sample.txt';
while ( my $line = readline($fh) ) {
    print $line;
}

readline($fh)<$fh> と同じです。上記のコードは次と同じです。

open my $fh, '<', './sample.txt';
while ( my $line = <$fh> ) {
    print $line;
}

readline は、リストコンテキスト (戻り値をリストで受け取る状況) なら、各行をファイルの最後まで読み取り、 それらをリストとして返します。

open my $fh, '<', 'sample.txt';
my @lines = readline($fh);
print join( '', @lines );

上記のコードは次と同じです。

open my $fh, '<', 'sample.txt';
my @lines = <$fh>;
print join( '', @lines );

なお、ここで言う「行」とは $/ にセットされた値で区切られた文字列のことです。 通常、$/ には改行コードがセットされていますが、もし異なる値をセットすれば、 readline から得られる文字列は異なってきますので、注意してください。

readline は読み取りに失敗すると、エラーメッセージを $! にセットします。 しかし、その場合、ファイルの最後に到達したときと同様に undef を返します。 もし厳密に読み取りエラーを判定したい場合は、eof とうまく組み合わせて読み取るのが良いでしょう。

open my $fh, '<', './sample.txt';
while ( !eof($fh) ) {
    defined( my $line = readline $fh ) or die "Failed to read a line: $!";
    print $line;
}