Câu trả lời:
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 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 nhau, bạn có thể sử dụng GetOpt::Std
và GetOpt::Long
xử lý chúng dễ dàng. GetOpt::Std
chỉ hỗ trợ chuyển đổi 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à đối số thứ nhất (nghĩa là "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
.
Contains the name of the current file when reading from <> .
Bạn vượt qua chúng giống như bạn đang nghĩ và trong kịch bản của bạn, bạn có được chúng từ mảng @ARGV
. Thích 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ừ đây .
$#ARGV + 1
bạn cũng có thể nói@ARGV
ARGV[0]
hoặc $argv[1]
nếu bạn đang tìm kiếm đối số cụ thể.
foreach my $arg (@ARGV) {
print $arg, "\n";
}
sẽ in từng đối số.
Ngoài ra, một cách perlish quyến rũ hơn .....
my ($src, $dest) = @ARGV;
"Giả sử" hai giá trị được thông qua. Mã bổ sung có thể xác minh giả định là an toàn.
@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 khác 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ó như thế này:
% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff
Hoặc xem bài viết gốc để biết thêm chi tiết:
Nếu các đối số là tên tệp được đọc từ đó, hãy sử dụng toán tử kim cương (<>) để lấy nội dung của chúng:
while (my $line = <>) {
process_line($line);
}
Nếu các đối số là tùy chọn / công tắc, hãy sử dụng GetOpt :: Std hoặc GetOpt :: Long, như đã được hiển thị bởi sleef13.myopenid.com.
Nếu bạn là người khác, bạn có thể truy cập chúng bằng cách truy cập @ARGV một cách rõ ràng hoặc bằng 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ỉ hoạt động nếu bạn ở bên ngoài tất cả sub
. Trong vòng a sub
, nó sẽ truy xuất danh sách các đối số được truyền cho sub
chứ không phải các đối số được truyền cho chương trình.)
my $output_file;
if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))
{
$output_file= chomp($ARGV[1]) ;
}
Nếu bạn chỉ muốn một số giá trị, bạn chỉ có thể sử dụng mảng @ARGV. Nhưng nếu bạn đang tìm kiếm thứ gì đó mạnh hơn để xử lý một số tùy chọn dòng lệnh, bạn nên sử dụng Getopt :: Long .
./script.pl
hoặc toàn bộ điều không nên xảy ra trong thời gian chạy.