2011-02-16 88 views
11

我正在尋找一種簡單的方法來檢查正確數量的命令行參數,如果發生錯誤並顯示用法消息,然後立即退出。簡單的方法來檢查Perl中的有效命令行參數?

我想到了什麼樣

if (@ARGV < 3) { 
    print STDERR "Usage: $0 PATTERN [FILE...]\n"; 
    exit 1; 
} 

這是一個有效的模式? Sry,我是一個完全的Perl noob :-)。

回答

29

另外,我會強烈建議使用Perl中處理命令行參數,Getopt::Long模塊的慣用方式(並開始使用命名的參數,而不是基於位置的)。

如果你有3個參數,你並不真正關心。如果您有參數a,b和C,您通常會關心。至於命令行界面設計,3個參數是關於位置參數(cmd <arg1> <arg2>)與任意順序(cmd -arg1 <arg1> -arg2 <arg2>)中的命名參數之間的截止位置。

所以你最好不要做:

use Getopt::Long; 
my %args; 
GetOptions(\%args, 
      "arg1=s", 
      "arg2=s", 
      "arg3=s", 
) or die "Invalid arguments!"; 
die "Missing -arg1!" unless $args{arg1}; 
die "Missing -arg2!" unless $args{arg2}; 
die "Missing -arg3!" unless $args{arg3}; 
5

是的,沒關係。 @ARGV包含命令行參數並在標量上下文中評估它們的編號。

(雖然它看起來像你的意思是從你的錯誤信息@ARGV < 2< 1

10

另一種常見的方式做到這一點是使用die

die "Usage: $0 PATTERN [FILE...]\n" if @ARGV < 3; 

你可以在@ARGV特別多的幫助變量在你的命令行:

perldoc -v @ARGV 
+0

我的`perldoc`不能這樣工作。 – aschepler 2011-02-16 22:07:24

+0

您使用的是哪個版本的Perl?或者你可能需要爲你的shell轉義`@`。參見`perldoc -h`。 – toolic 2011-02-16 22:08:51

-3

你可以用$#ARGV來比較而不是數組@ARGV

if ($#ARGV < 3) { ... 
+2

這是錯誤的。沒有`$ ARGV`標量。 – Tim 2011-02-16 22:03:39

1

使用$#ARGV獲得傳遞的參數的總數Perl腳本,像這樣:

if (@#ARGV < 4) 

我以前使用過和工作如http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/所示。

參見在http://perldoc.perl.org/perlvar.html原始文檔,它指出:

@ARGV

陣列@ARGV包含專門用於該腳本的命令行參數。 $#ARGV通常是參數個數減1,因爲$ ARGV [0]是第一個參數,而不是程序的命令名稱本身。請參閱$ 0作爲命令名稱。

相關問題