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