我使用glob
搜索文件时遇到了一些奇怪的行为。
(我认为它的意图,但在我的情况下我不想要它)
我有2个名为aaa:bbb
和aaa:ccc
的文件。
我有代码来查看前缀为aaa:*
的文件是否存在。我用这段代码做到了这一点:
my $filelocation_special = "aaa";
if (glob($filelocation_special . ":*")) {
# file(s) exists!
}
这很有效。但是,如果我再次运行相同的代码,则glob会返回undefined。
这些是我的回报:(大多数时候无论如何)
print STDERR "glob: " . glob($filelocation_special . ":*") . "\n";
# 1 run: aaa:bbb
# 2 run: aaa:ccc
# 3 run:
如何重置 glob
以便始终只检查具有此前缀的文件是否存在?
也许我应该完全使用一些不同的检查,但我似乎找不到任何快速的东西,只检查文件是否存在。
答案 0 :(得分:3)
glob
是call to glob
in scalar context。
在标量上下文中,glob遍历 这样的文件名扩展,在列表返回时返回undef 耗尽。
因此,每当您在标量上下文中使用相同的参数调用undef
时,以及来自同一行代码的 ,您将获得不同的结果,最终您将得到{{ 1}}当与您的参数匹配的文件列表用尽时。
要表达意思是"如果有与此模式匹配的文件......",则需要以某种方式使用列表上下文。
@tmp = glob(pattern)
if (@tmp)
if (()=glob(pattern))
if (@{[glob(pattern)]})
@*
是标点符号*
的许多值的有效全局数组标识符)
if (@@=glob(pattern))
if (@<=glob(pattern))
if (@:=glob(pattern))
他们甚至可以写成
if (@ <= glob(pattern))
if (@ := glob(pattern))
因此建议更多secret operators候选人。
@@ = EXPR like the goatse operator, returns a count of elements
@ <= EXPR in EXPR when EXPR is evaluated in list context; useful
@ := EXPR when EXPR in scalar context does not do this