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

时间:2017-02-01 14:15:03

标签: perl glob

我使用glob搜索文件时遇到了一些奇怪的行为。 (我认为它的意图,但在我的情况下我不想要它)

我有2个名为aaa:bbbaaa: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以便始终只检查具有此前缀的文件是否存在?

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

1 个答案:

答案 0 :(得分:3)

globcall 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