2009-10-22 27 views
10

Tôi đang cố gắng thu thập các giá trị từ dòng lệnh bằng cách sử dụng Getopt::Std trong tập lệnh Perl của tôi.Làm cách nào để đặt giá trị mặc định bằng Getopt :: Std?

use Getopt::Std; 
$Getopt::Std::STANDARD_HELP_VERSION = 1; 
getopts('i:o:p:'); 
my $inputfile = our $opt_i; 
my $outputfile = our $opt_o; 
my $parameter_value = our $opt_p; 

Ở đây hai biến đầu tiên ($ inputfile, $ outputfile) là bắt buộc nhưng biến cuối cùng ($ parameter_value) là tùy chọn và có thể bỏ qua.

Tôi đang cố gắng đặt một số giá trị theo mặc định thành biến cuối cùng ($ parameter_value) khi cờ -p bị bỏ qua tại dòng lệnh.

tôi đã cố gắng sử dụng này:

my $parameter_value = our $opt_p || "20"; 

Đây đèo nó giá trị đúng khi cờ -p bị bỏ qua tại dòng lệnh. Nhưng vấn đề là khi tôi đang cung cấp một số giá trị từ dòng lệnh (ví dụ -p 58), cùng giá trị 20 được truyền cho chương trình thay vì 58 mà tôi đã chuyển từ dòng lệnh.

Bạn có thể giúp tôi bằng cách chỉ ra những sai lầm tôi đang thực hiện ở đây không?

Cảm ơn bạn.

Trả lời

16
#/usr/bin/perl 

use strict; 
use warnings; 

use Getopt::Std; 

getopts('i:o:p:'); 
our($opt_i, $opt_o, $opt_p); 

my $inputfile = $opt_i; 
my $outputfile = $opt_o; 
my $parameter_value = $opt_p || "20"; 

print "$_\n" for $inputfile, $outputfile, $parameter_value; 
 
C:\Temp> ks -iinput -ooutput -p55 
input 
output 
55 
 
C:\Temp> ks -iinput -ooutput 
input 
output 
20 
+0

Tốt nhất :) = +1 – DVK

+0

thanx Sinan, Điều này hoạt động rất tốt và giữ nguyên định dạng mã của tôi. Thanx một tấn. – Suren

+5

Nếu bạn đang sử dụng 5.10+ sẽ tốt hơn nếu sử dụng '//' thay vì '||' vì các phép thử sau này cho sự thật, không được định nghĩa-Ness. Điều này sẽ ngăn bạn không thể vượt qua các giá trị sai (ví dụ: 0). Cách kéo dài để có được hành vi tương đương trước 5.10 là '$ x = xác định $ y? $ y: Z' trong đó 'Z' là giá trị mặc định. –

17

Điều tốt nhất là sử dụng GetOpt::Long và sử dụng hàm băm thay vì các biến riêng lẻ. Sau đó, bạn có thể vượt qua các giá trị mặc định bằng cách di trú trước mảng

use Getopt::Long; 
    my %opts = (parameter => 20); 
    GetOptions(\%opts, 
      'p|parameter=i', 
      'o|outputfile=s', 
      'i|inputfile=s' 
    ) or die "Invalid parameters!"; 

    # I didn't bother cloning STANDARD_HELP_VERSION = 1; 
+0

Cảm ơn brian d Foy nó hoạt động bây giờ :) – Suren

+2

;);););););) – DVK

+0

Sinan - (1) Bạn chỉ cần phá hủy các trò đùa :-(; (2) Do Tôi nhận được một huy hiệu cho cả hai ngôi sao lừng danh Perl chỉnh sửa bài đăng của tôi trong cùng một ngày? :) – DVK

1

Tôi đề nghị thiết lập các biến lựa chọn giá trị mặc định trước khi gọi getopts. Ngoài ra, bạn có thể sử dụng biến $ opt_ trong thông báo sử dụng của mình để hiển thị các giá trị mặc định.

use Getopt::Std; 
$Getopt::Std::STANDARD_HELP_VERSION = 1; 
our $opt_p = 20; 
sub HELP_MESSAGE { print " -p parameter value (default $opt_p)\n"; } 
getopts('i:o:p:'); 
my $inputfile = our $opt_i; 
my $outputfile = our $opt_o; 
my $parameter_value = our $opt_p; 
+0

Hoặc chỉ sử dụng '$ opt_i' bất cứ khi nào bạn cần. Sau đó, nó rõ ràng đó là một tham số. – Otheus

0
#/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Std; 

$Getopt::Std::STANDARD_HELP_VERSION = 1; 

my %opts =(); 
getopts('i:o:p:', \%opts); 
my $inputfile = $opts{i}; 
my $outputfile = $opts{o}; 
my $parameter_value = $opts{p} || "20"; 
print "$inputfile, $outputfile, $parameter_value\n"; 
Các vấn đề liên quan