【问题标题】:Perl Globbing a Variable stops on first matchPerl Globbing 变量在第一次匹配时停止
【发布时间】:2020-11-09 08:32:15
【问题描述】:

我正在尝试在 Perl 中循环遍历我的目录中的一些文件。假设我的当前目录包含:song0.txt、song1.txt、song2.txt、song3.txt、song4.txt。

我提供“song?.txt”作为我的程序的参数。

当我这样做时:

foreach $file (glob "$ARGV[0]") {
    printf "$file\n";
}

打印“song0.txt”后停止。

但是,如果我将“$ARGV[0]”替换为“song?.txt”,它会按预期打印出所有 5 个。为什么 Perl glob 不能处理变量,我可以做些什么来解决这个问题?

【问题讨论】:

  • 用双引号提供参数 - perl script.pl "song?.txt".

标签: perl command-line-arguments glob


【解决方案1】:

当您使用 song?.txt 调用程序时,shell 会扩展 ? 所以

prog.pl song?.txt -->  prog.pl song0.txt song1.txt ...

因此程序中的"$ARGV[0]"song0.txt,而Perl 的glob 与它无关。

所以你要么做

foreach my $file (@ARGV) { }

并使用prog.pl song?.txt 调用程序,或者在 Perl 中进行 globbing

foreach my $file (glob "song?.txt") { ... }

现在 Perl 的 glob 将在模式中使用 ? 构造文件列表。

两者中哪个“更好”取决于上下文。但我宁愿向程序提交一个直接的文件列表,如果这是一个平等的选择,而不是纠缠于程序中的glob-ing 模式。

另请注意,Perl 的 glob 是一个古老的“恶魔”,在某些情况下具有“有趣”的行为。

【讨论】:

  • 当然,也可以在原程序中使用prog.pl 'song?.txt'(但为什么呢?)
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 2022-12-03
相关资源
最近更新 更多