【问题标题】:Perl glob returning false positive when trying to match specific file typesPerl glob 在尝试匹配特定文件类型时返回误报
【发布时间】:2022-01-14 10:28:22
【问题描述】:

我正在尝试使用 glob 匹配目录中的“program.log”或“program.log.gz”或两者,但 glob 将两个字符串都返回到 @array,无论它们是否存在。

我做到了

@array = glob ("$dir/program.{log,log.gz}");

现在@array 包含

$dir/program.log
$dir/program.log.gz

不管它们是否真的存在。

似乎 glob 只是扩展字符串并将其传递给@array,而不管文件是否实际存在。这是 glob 的预期行为吗?如果是这样,我如何只将存在的文件名传递给@array?

【问题讨论】:

  • 就像在 shell 中一样,只有 *? 执行文件系统扩展。例如,glob("{a,b}{c,d}") 将返回 abadbcbd,无论这些文件是否存在。

标签: perl


【解决方案1】:

这是glob 的记录行为:

如果非空大括号是 glob 中唯一使用的通配符,则不会匹配文件名,但可能会返回许多字符串。例如,这会产生九个字符串,每个字符串对应一个水果和颜色:

my @many = glob "{apple,tomato,cherry}={green,yellow,red}";

如果您只想将现有文件传递给数组,可以使用grep 和文件测试,例如-e(存在)

my @files = grep -e, glob ("$dir/program.{log,log.gz}");

【讨论】:

  • 感谢您的澄清!不会撒谎,当我第一次阅读 perldoc 时,我不太明白它在说什么。
  • @Xflkekw 不客气。 perldocs 一开始可能很难理解,但它们确实包含很多有用的信息,因此请务必仔细阅读。
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2021-08-10
  • 2019-06-01
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多