我正在研究Perl脚本.如何将命令行参数传递给它?
例:
script.pl "string1" "string2"
user44511.. 188
取决于你想做什么.如果要将这两个参数用作输入文件,则可以将它们传入然后用于<>
读取其内容.
如果它们具有不同的含义,您可以轻松使用GetOpt::Std
和GetOpt::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
.
取决于你想做什么.如果要将这两个参数用作输入文件,则可以将它们传入然后用于<>
读取其内容.
如果它们具有不同的含义,您可以轻松使用GetOpt::Std
和GetOpt::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
.
你就像你想的那样传递它们,并且在你的脚本中,你从数组中获取它们@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"; }
将打印每个参数.
或者,更性感的方式......
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 1 2 3 4 5
如果参数是要读取的文件名,请使用菱形(<>)运算符来获取其内容:
while (my $line = <>) { process_line($line); }
如果参数是选项/开关,请使用GetOpt :: Std或GetOpt :: Long,如slavy13.myopenid.com所示.
如果他们不是其他东西,您可以通过显式或使用shift
命令遍历@ARGV来访问它们:
while (my $arg = shift) { print "Found argument $arg\n"; }
(请注意,shift
只有在所有sub
s 之外的情况下才能执行此操作.在a中sub
,它将检索传递给sub
传递给程序的参数列表,而不是传递给程序的参数列表.)
my $output_file; if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i")) { $output_file= chomp($ARGV[1]) ; }