2012-09-17 174 views
3

我在分配参数值/命令行参数时遇到了麻烦。这是我真正想要做的。在perl中传递命令行参数

Test.pl 
#!/usr/bin/perl 

#Variable declaration 

$RUN_DIR="/home/ckhau/database/experiment/test"; 
    #Main program 

$index=-999; 
#my $ARGV; 
@files = <$RUN_DIR/b*.txt>; 

foreach $file (@files) 
{ 
#$SCRIPT="perl abcdinfo.pl $file"; 
$SCRIPT="perl abc.pl $file"; 
system("$SCRIPT");  
} 

我试图与@ARGV取代的b * .txt和试图运行该程序即当i相

@files = <$RUN_DIR/@ARGV>; 

然后替换上面的代码尝试使用命令行运行

perl Test.pl b*.txt 

这给了我一个错误Perl:不匹配。任何人都可以帮我解决以下问题。

如何使用此命令行参数?

我可以在命令行“b * .txt”或“r _ *。txt”中使用这些语法吗?

+1

这可能与shell不能很好地处理命令行参数中的*有关。 – Gyan

+0

你在运行这个脚本的shell是什么? Windows命令提示符? Linux bash shell? –

+0

@Jonah Bishop:我正在使用linux – unkaitha

回答

3

shell正试图将b*.txt扩展到当前目录中匹配文件的列表。一旦你的程序接收到这些价值,你glob看起来像

@files = </home/ckhau/database/experiment/test/b1.txt b3.txt b3.txt> 

其中ISN;吨你想要什么,如果没有b1.txt$RUN_DIR目录

,以防止shell将无法找到任何文件通配符你只需把它放在引号中的通配符文件模式,所以你的命令变为

perl Test.pl 'b*.txt' 

除此之外,你的程序确实需要改进。您应该在所有程序的开头始终使用use strictuse warnings,并在首次使用时声明每个变量;您应该只使用@ARGV的第一个元素作为文件模式,而不是整个数组;它是错把标量加上引号,当你只是希望自己的内容

在这个重构原始的

#!/usr/bin/perl 

use strict; 
use warnings; 

my $run_dir="/home/ckhau/database/experiment/test"; 

my $pattern = "$run_dir/$ARGV[0]"; 

my $index = -999; 
my @files = glob $pattern; 

foreach my $file (@files) { 
    my $script = "perl abc.pl '$file'"; 
    system $script; 
} 

更新

的看看如果你真的想有多个通配符模式作为Test.pl的参数,那么您必须将$run_dir目录打包到每个目录的开头。最好的办法是使用File::Spec模块的rel2abs函数。完整的脚本将如下所示

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec; 

my $run_dir="/home/ckhau/database/experiment/test"; 

my $pattern = join ' ', map File::Spec->rel2abs($_, $run_dir), @ARGV; 

my $index = -999; 
my @files = glob $pattern; 

foreach my $file (@files) { 
    my $script = "perl abc.pl '$file'"; 
    system $script; 
} 
+0

非常感谢Borodin ...对我来说工作正常.. – unkaitha

+0

你在更新中提到的那个是我真正想要的那个,也就是说。我将不得不提供很多通配符模式但是我无法安装这些CPAN模块,因此是没有这些模块的情况下更好的方法。 – unkaitha

+0

建议新手使用'严格使用'和'使用警告' – David