Perl Globbing 变量在第一次匹配时停止

Perl Globbing a Variable stops on first match

我正在尝试使用 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 不能处理变量?我该怎么做才能解决这个问题?

当您使用 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 是一个古老的“恶魔”,在某些情况下具有“有趣”的行为。