Perl glob 检查带前缀的文件是否存在



我得到一些奇怪的行为,使用 glob 搜索文件。(我认为这是有意的,但我不希望它在我的情况下)

我有 2 个名为 aaa:bbbaaa:ccc 的文件。

我有代码可以查看前缀aaa:*的文件是否存在。我用这段代码来做这件事:

my $filelocation_special = "aaa";
if (glob($filelocation_special . ":*")) {
  # file(s) exists!
}

这行得通。但是,如果我再次运行相同的代码两次,glob 返回未定义。

这些是我的回报:(无论如何大部分时间)

print STDERR "glob: " . glob($filelocation_special . ":*") . "n";
# 1 run: aaa:bbb
# 2 run: aaa:ccc
# 3 run: 

我该怎么做才能glob重置为始终只检查是否存在具有此前缀的文件?

也许我应该完全使用一些不同的检查,但我似乎找不到任何快速的东西,只是检查文件是否存在。

if (glob(...))是在标量上下文中对glob的调用。

在标量上下文中,glob 迭代遍历 此类文件名扩展,当列表 用尽。

因此,每次在标量上下文中使用相同的参数和同一行代码调用glob时,都会得到不同的结果,最终当与参数匹配的文件列表用尽时,您将获得undef

要使您的表达式表示"如果有与此模式匹配的文件......",您需要以某种方式使用列表上下文。

@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))

因此,建议再为秘密操作员提供一些候选人。

@@ = 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

最新更新