【问题标题】:perl glob check if file with prefix existsperl glob 检查带前缀的文件是否存在
【发布时间】:2017-06-18 07:50:36
【问题描述】:

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

我有两个名为 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总是只检查带有这个前缀的文件是否存在?

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

【问题讨论】:

  • 这是来自perldoc.perl.org/File/Glob.htmlCORE::glob:bsd_glob
  • 请求来自我们的 iOS 应用。所以运行的代码之间会有一些延迟。运行 3 次大约需要 5 秒。
  • glob 的结果分配给一个数组可以解决这个问题,您很可能想知道文件的名称以及它们是否存在。

标签: perl glob


【解决方案1】:

if (glob(...))call to glob in scalar context

在标量上下文中,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))

因此建议了更多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

【讨论】:

  • 哇。那是一些非常奇怪的代码。我试过了。它的工作方式正是我想要的。谢谢!
  • this question 上有关于标量 glob 的一些很好的讨论。
  • 不鼓励使用这样的符号标识符,因为它们是为 Perl 内置变量保留的。在不寻常的地方使用带有空格的未定义符号变量编写代码也是非常不考虑的,因为大多数 Perl 程序员将无法快速解析它。检查与glob 模式匹配的文件是否存在的明显方法是使用if ( my @files = glob 'aaa:*' ) { ... },其中数组@files 仅针对if 块的长度定义。 “秘密操作员”大多是婴儿玩具,而不是用于生产软件的有效构造
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多