![](/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.