2008-12-12 35 views

Trả lời

172

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::StdGetOpt::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.

+27

$ 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

+4

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

+0

Biến ARGV $ là những gì tôi sẽ sử dụng sau đó. Cảm ơn. – lamcro

56

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.

+7

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

+9

Thay vì '$ # ARGV + 1' bạn cũng có thể đã nói' @ ARGV' –

+0

chỉ cần sử dụng 'ARGV [0]' hoặc '$ argv [1]' nếu bạn đang tìm đối số cụ thể. – Manoj

27
foreach my $arg (@ARGV) { 
    print $arg, "\n"; 
} 

sẽ in từng đối số.

+0

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

7

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.)

2

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.

23

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.

+6

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. –

+0

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 –

19

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:

+0

Rất đẹp và đơn giản! –

13

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

enter image description here

+0

Và cách này được sử dụng như thế nào? –

+0

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

5
my $output_file; 

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i")) 

{ 

$output_file= chomp($ARGV[1]) ; 


} 
+2

Cung cấp thêm chi tiết về mã của bạn –

Các vấn đề liên quan