![](/img/trans.png)
[英]How can I pass command-line arguments containing special characters to a process launched via Perl or Bash?
[英]How can I pass command-line arguments to a Perl program?
我正在编写 Perl 脚本。 如何将命令行参数传递给它?
示例:
script.pl "string1" "string2"
取决于你想做什么。 如果你想使用这两个参数作为输入文件,你可以直接传入它们,然后使用<>
读取它们的内容。
如果它们有不同的含义,您可以使用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";
}
将打印每个参数。
或者,一种更性感的perlish方式......
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
或查看原文了解更多详情:
如果参数是要读取的文件名,请使用菱形 (<>) 运算符获取其内容:
while (my $line = <>) {
process_line($line);
}
如果参数是选项/开关,请使用 GetOpt::Std 或 GetOpt::Long,如 slavy13.myopenid.com 所示。
如果它们是其他东西,您可以通过显式遍历 @ARGV 或使用shift
命令来访问它们:
while (my $arg = shift) {
print "Found argument $arg\n";
}
(请注意,使用shift
执行此操作仅当您在所有sub
之外时才有效。在sub
,它将检索传递给sub
的参数列表,而不是传递给程序的参数列表。)
my $output_file;
if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))
{
$output_file= chomp($ARGV[1]) ;
}
如果你只想要一些值,你可以只使用 @ARGV 数组。 但是如果你正在寻找更强大的东西来进行一些命令行选项处理,你应该使用Getopt::Long 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.