Perl 使用通配符从命令行打开文件

Perl open file from command line with wildcard

我正在以这种方式执行我的脚本:

./script.pl -f files*

我查看了其他一些主题(例如

如果我像写在这个线程中那样硬编码文件名,我会得到我想要的结果。如果我从命令行获取它,它不会。

我的选项子例程应该将我通过这种方式获得的所有文件保存在一个数组中。

my @file;
sub Options{
  my $i=0;
  foreach my $opt (@ARGV){
    switch ($opt){
      case "-f" {
        $i++;

        ### This part does not work:
        @file= glob $ARGV[$i];
        print Dumper("$ARGV[$i]");   #$VAR1 = 'files'; 
        print Dumper(@file);   #$VAR1 = 'files'; 
      }
    }
    $i++;
  }
}

似乎执行被提前解释了,通配符(*)在过程中被删除了。

期望的结果:从命令行执行后,所有以 files 开头的文件都保存在一个数组中。

希望您能解决我的问题。如有不便随时询问。

谢谢。

好吧,首先我建议使用一个模块在命令行上执行参数: Getopt::Long 例如。

但除此之外你的问题更简单 - 你的 shell 在 perl 得到它之前扩展了 'file*'。 (shell glob 先到那里)。

如果您这样做:

-f 'file*' 

然后它会正常工作。你应该能够看到这个 - 例如 - 如果你只是:

use Data::Dumper;
print Dumper \@ARGV; 

我希望您看到的列表比您想象的要长得多。

但是,我还要指出 - perl 有一个非常好的功能,您可以使用(取决于您对文件的处理方式)。

您可以使用 <>,它会自动打开并读取命令行中指定的所有文件(按顺序)。

由于您的 shell 已经将 glob files* 扩展为文件名列表,这就是 Perl 程序得到的结果。

$ perl -E 'say @ARGV' files*
files1files2files3

如果您的 shell 可以为您完成,则无需在 Perl 中执行此操作。如果您想要的只是数组中的文件名,那么您已经有了包含这些文件的 @ARGV