Perl Globbing a Variable 在第一场比赛中停止

Jam*_*yyy 6 perl glob command-line-arguments

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

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

当我做:

foreach $file (glob "$ARGV[0]") {
    printf "$file\n";
}
Run Code Online (Sandbox Code Playgroud)

它在打印“song0.txt”后停止。

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

zdi*_*dim 8

当你打电话给你的程序与song?.txt外壳扩展了?如此

prog.pl song?.txt -->  prog.pl song0.txt song1.txt ...
Run Code Online (Sandbox Code Playgroud)

因此"$ARGV[0]",在程序中song0.txt,Perlglob与它无关。

所以你要么做

foreach my $file (@ARGV) { }
Run Code Online (Sandbox Code Playgroud)

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

foreach my $file (glob "song?.txt") { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

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