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


137

我正在研究Perl脚本。如何将命令行参数传递给它?

例:

script.pl "string1" "string2"

3
好吧,首先,您将需要它,./script.pl否则运行时将会发生很多问题。
Parthian Shot

Answers:


189

取决于您要做什么。如果要将这两个参数用作输入文件,则可以将它们传递进来,然后使用<>来读取它们的内容。

如果它们具有不同的含义,则可以使用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


29
$ ARGV [0]是第一个参数;perl从0开始计数,程序名位于$ 0中,而不是@ARGV。
derobert

4
尽管$ ARGV [0]令人困惑。.这是我希望在我搜索SO时找到的答案,谢谢和+1。
lexu


60

您可以按照自己的想法传递它们,并在脚本中从array中获取它们@ARGV。像这样:

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

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

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

}

这里


8
还值得注意的是,在某些编程语言中,第一个(0)参数是命令或脚本本身……当然,在perl中并不是这样。
danieltalsky

10
相反,$#ARGV + 1您可能也曾说过@ARGV
Leon Timmermans

1
只需使用,ARGV[0]或者$argv[1]如果您正在寻找特定的参数。
Manoj


24

另外,更性感的方式...

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

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


6
不知道这是怎么新的信息,但是我决定反对,因为您是新手。
乔尔·伯杰

它不性感。就像C / C ++一样通过argv / argc 提供@ARGV所有参数,所有参数都可以通过使用获得
Eugen Konkov

21

另一个选择是使用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

或查看原始文章以获取更多详细信息:


13

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

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

perl tmp.pl 1 2 3 4 5

在此处输入图片说明


7

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

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

如果参数是选项/开关,请使用slavy13.myopenid.com已经显示的GetOpt :: Std或GetOpt :: Long。

如果它们是别的东西,可以通过显式遍历@ARGV或使用以下shift命令来访问它们:

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

(请注意,shift仅当您不在all subs内时sub,此操作才起作用。在内,它将检索传递给的参数列表,sub而不是传递给程序的参数列表。)


5
my $output_file;

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

{

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


}

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.