看兩個例子:
$ perl -e ' print -e "registrar" && -d _ ? "YES" : "NO" '
YES
$ perl -e ' print -e "registrar" && -l _ ? "YES" : "NO" '
The stat preceding -l _ wasn't an lstat at -e line 1.
-d并且-l都是檔案測驗運算子。為什么第二個不起作用?-l _ 前面的 stat 與 -d _ 相同。
uj5u.com熱心網友回復:
大多數檔案測驗使用stat,它遵循符號鏈接;-l使用lstat,因為如果您想測驗它本身是否是符號鏈接,那么跟隨它是沒有意義的。因此錯誤。
diagnosticspragma可用于對錯誤和警告進行更詳細的解釋,包括以下內容:
$ perl -Mdiagnostics -E 'say -e "registrar" && -l _ ? "YES" : "NO" '
The stat preceding -l _ wasn't an lstat at -e line 1 (#1)
(F) It makes no sense to test the current stat buffer for symbolic
linkhood if the last stat that wrote to the stat buffer already went
past the symlink to get to the real file. Use an actual filename
instead.
Uncaught exception from user code:
The stat preceding -l _ wasn't an lstat at -e line 1.
如果使用 perl 5.10 或更新版本,檔案測驗可以直接鏈接,而不需要一起&&編輯。由于 perl 足夠聰明,可以選擇適當的 stat 函式,-e因此可以使用它來執行此操作:-l
$ mkdir registrar
$ perl -E ' say -e -d "registrar" ? "YES" : "NO" '
YES
$ perl -E ' say -e -l "registrar" ? "YES" : "NO" '
NO
我實際上需要存在而不是鏈接。有短手嗎?
該速記符號僅適用于所有測驗的簡單和-ing,但您可以lstat直接呼叫以查看檔案是否存在:
$ ln -s registrar registrar-link
$ perl -E 'say lstat "registrar" && ! -l _ ? "YES" : "NO" '
YES
$ perl -E 'say lstat "registrar-link" && ! -l _ ? "YES" : "NO" '
NO
$ perl -E 'say lstat "no-such-file" && ! -l _ ? "YES" : "NO" '
NO
在與單行相反的腳本中,我會使用File::stat下劃線表示法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504237.html
標籤:perl
上一篇:Perl中的“句柄”是什么?
