perl ファイルテストの特殊ファイルハンドル _

たまにperlのスクリプトを書くのですが
最近はまったのがこれ。

if(-f $file) {
ファイルの時の処理
}
elsif(-d _) {
ディレクトリの時の処理
}
elsif(-l _) {
シンボリックリンクの時の処理
}

ファイルテストで特殊なファイルハンドル_(アンダースコア)を使うと最初のファイルテストだけシステムコールが行われて、このファイルハンドルの参照では前回のテスト時のstat構造体が利用され何度もstat()を呼ぶことなくシステムコールのオーバヘッドを減らせるのですが・・・上のコードだとシンボリックリンクの時エラーになります。

というのも最初のファイルテストが -f でファイルかどうかをテストしてるのでstat()が内部的には呼ばれています。stat()はシンボリックのリンク先ファイルの情報を返すので、その結果を利用すると$fileがシンボリックリンクの時に正しく処理できません。

なので、この場合の正解は

if(-l $file) {
シンボリックリンクの時の処理
}
elsif(-d _) {
ディレクトリの時の処理
}
elsif(-f _) {
ファイルの時の処理
}

とすることで最初のファイルテストの時にlstat()が呼ばれ$fileがシンボリックリンクの時あるいはそれ以外でも意図したとおりに処理できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です