2016-09-07 58 views
3

在使用Getopt :: Long讀取命令行參數時,是否有強制使用-flags的方法?例如,在我目前的狀況:強制使用標誌Getopt :: Long

GetOptions('r=s' => \$var1, 
       'lf=f' => \$var2, 
       'uf=f' => \$var3, 
       'trd=i' => \$var4, 
       'vd=f' => \$var5) 
or die("$usage"); 

腳本不會退出或顯示$使用,如果仍然提供的參數,但沒有標誌(如-LF)。相反,它會一直運行,直到之後不可避免的錯誤,因爲參數沒有被讀入它們各自的變量(並且很可能是錯誤的順序)。

+0

現在還不清楚你的意思是「旗幟」。如果你用'-lf'作爲選項運行你的代碼,那麼'GetOptions'將返回一個錯誤狀態。你的意思是你想要一些選項是強制性的嗎? – Borodin

+0

@Borodin標誌我的意思是-lf,-uf,-trd和-vd。我可以運行腳本而不會產生錯誤結果:script.pl arg1 arg2 arg3 arg4。這是我的期望,這將無法運行,因爲它沒有提供:script.pl -lf arg1 -uf arg2 -trd arg3 -vd arg4。 – AnnaSchumann

回答

4

問:這就是爲什麼他們是所謂的「選擇」:當選擇不提供

一個 GetOptions不返回錯誤的結果。

來源:Getopt::Long documentation

你可以添加條件語句來檢查標誌的值,如果沒有定義它們,然後調用die或致電usage

1

Getopt::Long將搜索您在GetOptions調用中指定的所有命令行選項。他們都不是必需的,但一個人的選擇可能需要有一個特定類型的值,並GetOptions將返回狀態,如果值丟失或錯誤的類型

任何選項及其值從命令行中刪除,剩下的東西通常通過@ARGV傳遞給程序

大多數程序並不要求在命令行上提供所有可能的選項,所以如果你想堅持所有指定,那麼你可以簡單地測試它們與

use List::Util 'all'; 

die $usage unless all { defined } $var1, $var2, $var3, $var4, $var5; 

你也可以要求沒有輸入,沒有被指定爲其中的一個選項,在這種情況下,你可以檢查@ARGV

die $usage if @ARGV; 
0

只是檢查之後。

use File::Basename qw(basename); 

sub help { 
    print(...); 
    exit(0); 
} 

sub usage { 
    if (@_) { 
     my ($msg) = @_; 
     chomp($msg); 
     warn("$msg\n"); 
    } 

    my $prog_name = basename($0); 

    warn("Use $prog_name --help for more information\n"); 
    exit(1); 
} 

my ($var1, $var2, $var3, $var4, $var5); 

GetOptions(
    'help|h|?' => \&help, 
    'r=s'  => \$var1, 
    'lf=f'  => \$var2, 
    'uf=f'  => \$var3, 
    'trd=i' => \$var4, 
    'vd=f'  => \$var5 
) 
    or usage(); 

defined($var2) 
    or usage("-lf must be provided"); 
相關問題