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

标签 perl command-line-arguments 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 中进行通配
foreach my $file (glob "song?.txt") { ... }
Perl 现在在哪里glob将使用 ? 构建文件列表在图案中。
两者中的哪一个“更好”取决于上下文。但是我宁愿向程序提交一个直接的文件列表,如果这是一个平等的选择,而不是纠缠在 glob 中。 -ing 程序中的模式。
还要注意 Perl 的 glob是一个古老的“恶魔”,在某些情况下具有“有趣”的行为。

关于Perl Globbing a Variable 在第一场比赛中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62989476/

相关文章:

perl - Perl 中的 my 和 local 有什么区别?

字符数组和二维数组指针问题

python - 初学者Python : Writing GLOB Results to txt

c++ - 没有目录路径的CMake glob文件列表

python - 使用 PySpark 从名称不包含字符串的文件夹中读取文件

perl - 为什么 DBIx 柱没有放气?

perl - 我可以在源perl程序中插入断点吗?

perl - 迭代具有数十亿行的文件,输出出现次数最多的行

python - 将命令行参数传递给从 Makefile 调用的 python 脚本

c# - 不要从路径名 C# 中删除字符