我正在以这种方式执行我的脚本:
./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++;
}
}
似乎提前解释了执行,并且在此过程中删除了通配符(*)。
所需结果:从命令行执行后,所有以文件开头的文件都保存在数组中。
我希望你能解决我的问题。如果没有随意问。
谢谢。
答案 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
,其中包含这些文件名。