我在分配参数值/命令行参数时遇到了问题。这是我真正想做的事情。
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“中使用这些语法吗?
发布于 2012-09-17 01:57:28
外壳程序正在尝试将b*.txt
扩展到当前目录中的匹配文件列表。一旦您的程序接收到这些值,您的glob
将如下所示
@files = </home/ckhau/database/experiment/test/b1.txt b3.txt b3.txt>
这不是您想要的,并且如果您的$RUN_DIR
目录中没有b1.txt
,将无法找到任何文件
为了防止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;
}
https://stackoverflow.com/questions/12451929
复制