在perl中传递命令行参数

时间:2012-09-17 00:38:41

标签: perl command-line-arguments

我在分配参数值/命令行参数时遇到了麻烦。这就是我真正想做的事情。

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并尝试运行程序,即当我用

代替上面的代码时
@files = <$RUN_DIR/@ARGV>;

然后尝试使用命令行

运行
perl Test.pl b*.txt

这给了我一个错误perl:没有匹配。任何人都可以帮助我以下。

如何使用命令行参数???

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

1 个答案:

答案 0 :(得分:3)

shell正在尝试将b*.txt扩展到当前目录中的匹配文件列表。一旦您的程序收到这些值,您的glob就像

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

这不是你想要的,如果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;
}