-d_ ってなあに?

Plaggerソースコードの中に、私の知らない表現があったので興味を惹きました。

% ack "\-d_"
Plagger/Cache.pm
11:    mkdir $conf->{base}, 0700 unless -e $conf->{base} && -d_;

おお!?"-d_"のアンダーバーの部分って何!?

Perl のリファレンスで探したところ、これは特殊ファイルハンドルとのこと。

_ (下線)
  最後に成功したstat, lstat, またはファイルテスト演算子(-w $fileや-d
  $fileなど)の情報をキャッシュするのに用いられる特殊ファイルハンドルである。

プログラミングPerl VOLUME2 P.778より

プログラミングPerl〈VOLUME2〉

プログラミングPerl〈VOLUME2〉


なるほど。では、次のテストコードで確かめてみよう。

% cat test.pl
open FH,"dummy.txt" or die $!;

print "come1\n" if(-f FH);
print "come2\n" if(-d _);
print "come3\n" if(-f _);
print "come4\n" if(-d_);        # oops!
print "come5\n" if(-f_);

% touch dummy.txt
% perl test.pl
come1
come3
come4				# oops!
come5


あれ? ディレクトリでないはずのFH がディレクトリとして判定(# oops!、の部分)されている。これはなぜだろう!?