我在分配参数值/命令行参数时遇到了麻烦。这就是我真正想做的事情。
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”中使用这种语法???
答案 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 strict
和use 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;
}