有没有办法让Perl在Windows上支持通配符命令行参数,例如“ * .txt”?

在* nix系统上将通配符传递给Perl脚本时,例如

$ perl script.pl *.txt

像Bash这样的shell将扩展所有通配符(*?[])匹配项,因此在@ARGV中填充所有匹配项。

但是,Windows CMD在运行Perl解释器之前不会执行这种扩展。

是否有可能让Perl在内部处理此扩展以模仿* nix shell?

xiangzhy 回答:有没有办法让Perl在Windows上支持通配符命令行参数,例如“ * .txt”?

核心模块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创建的输入读取循环开始之前运行代码。

,

glob支持通配符扩展,因此可以使用它来动态更改@ARGV

BEGIN { @ARGV = map +glob,@ARGV; }

BEGIN块中运行可确保在解析其余代码之前修改@ARGV,更不用说运行了:

  

BEGIN代码块将被尽快执行,也就是在完全定义它的那一刻开始执行,甚至在解析包含文件的其余部分(或字符串)之前。

本文链接:https://www.f2er.com/3063866.html

大家都在问