如何将命令行参数传递给 Perl 程序?

我正在处理一个 Perl 脚本。如何将命令行参数传递给它?

例如:

script.pl "string1" "string2"
362940 次浏览

按照您的想法传递它们,在脚本中,从数组 @ARGV中获取它们。像这样:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";


foreach my $argnum (0 .. $#ARGV) {


print "$ARGV[$argnum]\n";


}

来自 给你

foreach my $arg (@ARGV) {
print $arg, "\n";
}

将打印每个参数。

取决于你想做什么。如果要使用这两个参数作为输入文件,只需将它们传入,然后使用 <>读取它们的内容。

如果它们有不同的含义,您可以使用 GetOpt::StdGetOpt::Long来轻松处理它们。GetOpt::Std只支持单字符开关,而 GetOpt::Long更加灵活。来自 GetOpt::Long:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
"file=s"   => \$data,      # string
"verbose"  => \$verbose);  # flag

另外,@ARGV是一个特殊的变量,它包含所有的命令行参数。$ARGV[0]是第一个(即。"string1")和 $ARGV[1]是第二个参数。访问 @ARGV不需要特殊的模块。

如果参数是要读取的文件名,则使用菱形(< >)运算符获取其内容:

while (my $line = <>) {
process_line($line);
}

如果参数是 options/switch,则使用 GetOpt: : Std 或 GetOpt: : Long,如 slavy13.myopenid.com 所示。

万一它们是别的什么东西,你可以通过@ARGV 显式地访问它们,或者通过 shift命令访问它们:

while (my $arg = shift) {
print "Found argument $arg\n";
}

(请注意,只有在所有 sub之外的情况下,使用 shift进行此操作才会起作用。在 sub中,它将检索传递给 sub的参数列表,而不是传递给程序的参数列表。)

如果只需要一些值,可以使用@ARGV 数组。但是,如果您正在寻找更强大的功能来处理一些命令行选项,那么您应该使用 Getopt: : Long

或者,一个更性感的波利方式... ..。

my ($src, $dest) = @ARGV;

“假设”两个值被传递。额外的代码可以验证假设是安全的。

还有一种选择是使用 perl-s,例如:

#!/usr/bin/perl -s


print "value of -x: $x\n";
print "value of -name: $name\n";

那就这么说吧:

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

详情请参阅 原文:

您可以通过将特殊变量 @ARGV分配给变量列表来直接访问它们。 例如:

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

Perl tmp.pl 12345

enter image description here

my $output_file;


if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))


{


$output_file= chomp($ARGV[1]) ;




}