Tôi đang làm việc trên một tập lệnh Perl. Làm thế nào tôi có thể vượt qua các tham số dòng lệnh cho nó?Làm cách nào để chuyển đối số dòng lệnh vào chương trình Perl?
Ví dụ:
script.pl "string1" "string2"
Tôi đang làm việc trên một tập lệnh Perl. Làm thế nào tôi có thể vượt qua các tham số dòng lệnh cho nó?Làm cách nào để chuyển đối số dòng lệnh vào chương trình Perl?
Ví dụ:
script.pl "string1" "string2"
Phụ thuộc vào những gì bạn muốn làm. Nếu bạn muốn sử dụng hai đối số làm tệp đầu vào, bạn chỉ có thể chuyển chúng vào và sau đó sử dụng <>
để đọc nội dung của chúng.
Nếu chúng có ý nghĩa khác, bạn có thể sử dụng GetOpt::Std
và GetOpt::Long
để xử lý chúng dễ dàng. GetOpt::Std
chỉ hỗ trợ các công tắc một ký tự và GetOpt::Long
linh hoạt hơn nhiều. Từ 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
Ngoài ra, @ARGV
là một biến đặc biệt có chứa tất cả các đối số dòng lệnh. $ARGV[0]
là lần đầu tiên (ví dụ: "string1"
trong trường hợp của bạn) và $ARGV[1]
là đối số thứ hai. Bạn không cần một mô-đun đặc biệt để truy cập @ARGV
.
$ ARGV [0] là đối số đầu tiên; perl đếm từ 0, và tên chương trình là $ 0 không phải @ARGV. – derobert
mặc dù $ ARGV [0] nhầm lẫn .. đây là loại câu trả lời tôi hy vọng sẽ tìm thấy, khi tôi tìm kiếm SO, cảm ơn và +1 từ tôi. – lexu
Biến ARGV $ là những gì tôi sẽ sử dụng sau đó. Cảm ơn. – lamcro
Bạn vượt qua chúng trong giống như bạn đang nghĩ, và trong kịch bản của bạn, bạn nhận được chúng từ các mảng @ARGV
. Giống như vậy:
my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";
foreach my $argnum (0 .. $#ARGV) {
print "$ARGV[$argnum]\n";
}
Từ here.
Nó cũng đáng chú ý rằng trong một số ngôn ngữ lập trình, đối số đầu tiên (0) là lệnh hoặc tập lệnh chính nó ... không phải như vậy trong perl mặc dù, tất nhiên. – danieltalsky
Thay vì '$ # ARGV + 1' bạn cũng có thể đã nói' @ ARGV' –
chỉ cần sử dụng 'ARGV [0]' hoặc '$ argv [1]' nếu bạn đang tìm đối số cụ thể. – Manoj
foreach my $arg (@ARGV) {
print $arg, "\n";
}
sẽ in từng đối số.
Nếu không sử dụng getopts, đây là cách tôi sẽ khuyên bạn nên không phá hoại đi qua một danh sách đối số. Dựa trên http://www.perlmeme.org/howtos/syntax/foreach.html có vẻ như cú pháp là chính xác; để báo trước, hãy kiểm tra phần, _Side-effects: Biến điều khiển là một bí danh cho danh sách element_ – jaredor
Nếu đối số là tên tập tin được đọc từ, sử dụng kim cương (<>) nhà điều hành để có được nội dung của họ:
while (my $line = <>) {
process_line($line);
}
Nếu đối số là tùy chọn/bị chuyển mạch, sử dụng getopt :: Std hoặc getopt :: Dài, như đã được hiển thị bởi slavy13.myopenid.com.
Trên cơ hội ra rằng họ cái gì khác, bạn có thể truy cập chúng bằng cách đi bộ qua @ARGV một cách rõ ràng hoặc qua các nhân shift
lệnh:
while (my $arg = shift) {
print "Found argument $arg\n";
}
(Lưu ý rằng làm điều này với shift
sẽ chỉ làm việc nếu bạn đang ở bên ngoài tất cả sub
s. Trong phạm vi sub
, nó sẽ truy xuất danh sách các đối số được chuyển đến sub
thay vì các đối số được chuyển đến chương trình.)
Nếu bạn chỉ muốn một số giá trị, bạn chỉ có thể sử dụng @ARGV mảng. Nhưng nếu bạn đang tìm kiếm thứ gì đó mạnh mẽ hơn để thực hiện một số tùy chọn dòng lệnh, bạn nên sử dụng Getopt::Long.
Ngoài ra, một cách Perlish quyến rũ .....
my ($src, $dest) = @ARGV;
"Giả" hai giá trị được thông qua. Mã bổ sung có thể xác minh giả định là an toàn.
Không chắc đây là thông tin mới, nhưng tôi đã quyết định chống lại một downvote, kể từ khi bạn mới. –
Nó không phải là quyến rũ hơn. Tất cả ** đối số có sẵn thông qua '@ ARGV' mà không có bất kỳ hành động nào từ bạn ** giống như C/C++ cung cấp chúng thông qua argv/argc –
Tuy nhiên, một tùy chọn là sử dụng perl -s, ví dụ:
#!/usr/bin/perl -s
print "value of -x: $x\n";
print "value of -name: $name\n";
Sau đó gọi nó là như thế này:
% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff
Hoặc xem the original article để biết thêm chi tiết:
Rất đẹp và đơn giản! –
Bạn có thể truy cập trực tiếp, bằng cách gán biến đặc biệt @ARGV
vào danh sách các biến. Vì vậy, ví dụ:
($st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;
perl tmp.pl 1 2 3 4 5
Và cách này được sử dụng như thế nào? –
kiểm tra nhận xét cập nhật, bạn chỉ cần chuyển từ không gian dòng lệnh được tách ra – pkm
my $output_file;
if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))
{
$output_file= chomp($ARGV[1]) ;
}
Cung cấp thêm chi tiết về mã của bạn –
Những vỏ nào bạn sử dụng? – reinierpost
Vâng, trước tiên, bạn sẽ cần cho nó được './Script.pl' hoặc một toàn bộ lotta nothin 'sẽ xảy ra đến thời gian chạy. –