ファイルからレコードをフェッチする
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;
}