Perl文件测试操作符疑问:为何-l _报错而-d _可正常运行?
Perl文件测试操作符
-l报错原因解析 你遇到的问题核心在于Perl对特殊句柄_的使用规则,以及stat和lstat系统调用的区别:
- 普通的文件测试操作符(比如
-e、-d)会调用系统的stat()函数,将结果缓存到_这个特殊句柄中,后续的文件测试操作可以直接复用这个缓存。 - 但
-l(检测是否为符号链接)对应的是系统的lstat()函数——这个函数不会跟随符号链接,而是直接获取链接本身的属性。Perl要求,当你用-l _时,_中缓存的必须是lstat()的结果,而不是普通stat()的结果。
回到你的代码:
第一个命令里,-e "registrar"触发了stat(),缓存到_后,-d _复用这个stat()结果完全没问题,因为-d只需要普通文件属性。
第二个命令里,-e "registrar"依旧触发的是stat(),但后续的-l _需要的是lstat()的缓存结果,两者不匹配,所以Perl抛出了那个错误。
如果要实现类似逻辑,你可以直接对目标路径使用-l,或者先触发lstat()再复用缓存:
# 直接检测是否为符号链接 $ perl -e ' print -l "registrar" ? "YES" : "NO" ' # 先触发lstat缓存,再复用(示例:检测是链接且链接指向目录) $ perl -e ' print -l "registrar" && -d readlink("registrar") ? "YES" : "NO" '
内容的提问来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

