我正在处理一个 Perl 脚本。如何将命令行参数传递给它?
例如:
script.pl "string1" "string2"
按照您的想法传递它们,在脚本中,从数组 @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"; }
将打印每个参数。
取决于你想做什么。如果要使用这两个参数作为输入文件,只需将它们传入,然后使用 <>读取它们的内容。
<>
如果它们有不同的含义,您可以使用 GetOpt::Std和 GetOpt::Long来轻松处理它们。GetOpt::Std只支持单字符开关,而 GetOpt::Long更加灵活。来自 GetOpt::Long:
GetOpt::Std
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[0]
"string1"
$ARGV[1]
如果参数是要读取的文件名,则使用菱形(< >)运算符获取其内容:
while (my $line = <>) { process_line($line); }
如果参数是 options/switch,则使用 GetOpt: : Std 或 GetOpt: : Long,如 slavy13.myopenid.com 所示。
万一它们是别的什么东西,你可以通过@ARGV 显式地访问它们,或者通过 shift命令访问它们:
shift
while (my $arg = shift) { print "Found argument $arg\n"; }
(请注意,只有在所有 sub之外的情况下,使用 shift进行此操作才会起作用。在 sub中,它将检索传递给 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
my $output_file; if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i")) { $output_file= chomp($ARGV[1]) ; }