在* nix系统上将通配符传递给Perl脚本时,例如
$ perl script.pl *.txt
像Bash这样的shell将扩展所有通配符(*
,?
,[]
)匹配项,因此在@ARGV
中填充所有匹配项。
但是,Windows CMD在运行Perl解释器之前不会执行这种扩展。
是否有可能让Perl在内部处理此扩展以模仿* nix shell?
答案 0 :(得分:3)
核心模块File::DosGlob提供了以Windows用户期望的方式扩展通配符的工具,因此使用此模块提供的glob
只是一个问题,如下所示:
use File::DosGlob qw( glob );
@ARGV = map glob, @ARGV;
请注意,使用内置glob
进行此操作将破坏包含空格的路径,这在Windows中是相对常见的情况。它还可能会误处理*.*
,这将返回所有文件。
请注意,最好在处理命令行选项后扩展模式,以免冒将模式扩展为命令行选项的风险。
use File::DosGlob qw( glob );
use Getopt::Long qw( GetOptions );
GetOptions(...)
or die_usage();
@ARGV = map glob, @ARGV;
对于单缸运输,您可以使用以下内容:
perl -MFile::DosGlob=glob -ne"BEGIN { @ARGV = map glob, @ARGV } ..." ...
BEGIN
确保在-n
创建的输入读取循环开始之前运行代码。
答案 1 :(得分:2)