Perl从带有通配符的命令行打开文件

时间:2016-09-08 12:44:20

标签: perl command-line wildcard

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

./script.pl -f files*

我查看了其他一些主题(例如How can I open a file in Perl using a wildcard in the directory name?

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

我的选项子程序应该保存我在数组中以这种方式获得的所有文件。

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++;
  }
}

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

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

我希望你能解决我的问题。如果没有随意问。

谢谢。

2 个答案:

答案 0 :(得分:2)

好吧,首先我建议使用模块在命令行上执行args: 例如Getopt::Long

但是否则你的问题更简单 - 你的 shell 在perl获取它之前扩展'file *'。 (shell glob首先到达那里)。

如果你这样做:

-f 'file*' 

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

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

我希望你会看到比你想象的更长的清单。

但是,我还要指出 - perl有一个非常好的功能,你可以使用(取决于你对你的文件做什么)。

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

答案 1 :(得分:0)

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

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

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