我试图在我的 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 中进行通配foreach my $file (glob "song?.txt") { ... }
Perl 现在在哪里glob将使用 ?
构建文件列表在图案中。两者中的哪一个“更好”取决于上下文。但是我宁愿向程序提交一个直接的文件列表,如果这是一个平等的选择,而不是纠缠在
glob
中。 -ing 程序中的模式。还要注意 Perl 的
glob
是一个古老的“恶魔”,在某些情况下具有“有趣”的行为。
关于Perl Globbing a Variable 在第一场比赛中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62989476/