eof

ファイルハンドルの最後かをテストする

構文

解説

FILEHANDLE の読み取りにおいてファイルの最後に到達しているなら 1 を返します。 そうでなければ undef を返します。 ただし、FILEHANDLE が開いていない場合も 1 を返しますので注意してください。

open my $fh, '<', './sample.txt';
print eof($fh), "\n";    # ファイルの最後に到達していないので undef を返す
while (<$fh>) { }
print eof($fh), "\n";    # ファイルの最後に到達しているので 1 を返す
close $fh;
print eof($fh), "\n";    # ファイルが開かれていないので 1 を返す

引数が省略された場合は、最後に読み取ったファイルが適用されます。 ただし、ファイルを開いただけでは、そのファイルハンドルが適用されるわけではありません。 1 行でも読み取らないと、期待通りに適用されませんので注意してください。 基本的には明示的にファイルハンドルを引数として引き渡したほうが良いでしょう。

引数を省略すると言っても、eof() のように空のカッコを付けて呼び出すと、それは疑似ファイルを参照することになります。 次の例は、sample.pl というスクリプトファイルの内容ですが、 ターミナル (シェル) でコマンドライン引数にファイルを与えると、そのファイルを読み取り、内容を出力します。 そして、ファイルの最後まで到達したら、その旨を出力します。

#!/usr/bin/env perl
while(<>) {
    print $_;
    if(eof()) {
        print "疑似ファイルの最後に到達しました。";
    }
}

このスクリプトは、ターミナル (シェル) から次のようにして呼び出します。

$ perl sample.pl test.txt

引数にはカレントディレクトリに存在するテキストファイルを引き渡しています。 こうすることで、スクリプト内では自動的に <> を通してファイルの中身を読み取ることができます。 その際に eof() は暗黙的に引数に指定したファイルを参照します。

しかし、引数に 2 つ以上のファイルを引き渡した場合は、期待通りにいきません。次のようにスクリプトを実行したとしましょう。

perl sample.pl test1.txt test2.txt test3.txt

この場合、スクリプトは引数に指定された 3 つのファイルを <> を通して切れ目なく読み取ってしまい、 eof() が 1 を返すのは最後のファイルを読み終わった時だけです。

実際に eof を使う必要はほとんどないでしょう。 なぜなら、入力演算子 <FILEHANDLE> はすべてを読み終わると undef を返し、 それをもってファイルの最後に到達したことが分かるからです。