2010-08-08 4 views
9

나는 Perl의 Getopt::Long 모듈을 사용하여 명령 줄 인수를 구문 분석합니다. 그러나 일부 인수가 누락 된 경우에도 true 값을 반환하는 것으로 보입니다. 이것이 사실인지 알 수있는 방법이 있습니까?인수가없는 경우 Perl의 Getopt :: Long을 어떻게 얻을 수 있습니까?

+0

위대한 질문입니다. undef에 대한 값을 검사하는 것 이외의 다른 방법이 있었으면합니다. – tster

+0

Getopt의 문서에서 필요한 옵션을 지정할 수 있음을 암시하는 이유는 이것이 많은 사람들에게 혼란을주는 이유입니다. "값을 취하는 옵션의 경우 옵션 값이 필요한지 여부와 옵션이 기대하는 값의 종류를 지정해야합니다." http://perldoc.perl.org/Getopt/Long.html – lfalin

답변

5

일반적인 오래된 Getopt :: Long에서는 이것을 직접 수행 할 수 없습니다. Jonathan이 말했듯이 undef에 대한 요구 사항을 확인해야합니다. 그러나 IMHO는 이것이 좋은 것입니다 - "필수"매개 변수는 무엇입니까? 종종 하나의 경우에 필요한 매개 변수가 있고 다른 매개 변수는 필요하지 않습니다. 가장 일반적인 예는 --help 옵션의 엄지입니다. 필수는 아니며 사용자가이 매개 변수를 사용하면 다른 "필수"매개 변수를 알지 못하거나 전달하지 않을 것입니다. 심지어 내가 required => 1 내 속성을 설정하지 MooseX :: 것은, Getopt와

use List:MoreUtils 'all'; 

Getopt::Long::GetOptions(\%options, @opt_spec); 
print usage(), exit if $options{help}; 
die usage() unless all { defined $options{$_} } @required_options; 

:

나는 내 코드의 일부 (내가 MooseX::Getopt를 사용으로 전환 될 때까지 아니라, 내가 사용)에서이 관용구를 사용하여 다시 --help 옵션 때문입니다. 대신 프로그램 실행 본문으로 이동하기 전에 필요한 모든 특성이 있는지 확인합니다.

package MyApp::Prog; 
use Moose; 
with 'MooseX::Getopt'; 

has foo => (
    is => 'ro', isa => 'Str', 
    documentation => 'Provides the foo for the frobnitz', 
); 
has bar => (
    is => 'ro', isa => 'Int', 
    documentation => 'Quantity of bar furbles to use when creating the frobnitz', 
); 

# run just after startup; use to verify system, initialize DB etc. 
sub setup 
{ 
    my $this = shift; 

    die "Required option foo!\n" unless $this->foo; 
    die "Required option bar!\n" unless $this->bar; 

    # ... 
} 
4

옵션은 선택 사항이므로 'Getopt'이름입니다.

Getopt::Long으로 설정된 옵션 값을 확인하십시오. 중요한 항목 중 하나가 'undef'이면 놓친 상태이므로 식별 할 수 있습니다.

반환 값은 명령 줄에 끔찍한 실수가 없음을 나타냅니다. 실수를 구성하는 요소는 사용자가 Getopt::Long을 사용하는 방법에 따라 다르지만 명령 줄에 -o output이 있지만 명령에서 -o 옵션을 인식하지 못하는 경우가 있습니다.

+3

가끔 옵션이 선택 사항이 아닙니다. – tster

+0

@tster : 동의합니다; 때로는 명령에 몇 가지 특정 옵션이 필요합니다. Getopt 패키지에 그러한 사실을 알릴 수 있으면 좋을 것입니다. 아마도 다른 Getopt 패키지 중 일부가이를 지원할 것입니까? 선택할 수있는 것들이 많이 있습니다 (그리고 저는 제 자신을 굴렸습니다 - 그러나 그것은 필수적인 주장을지지하지 않습니다). 필수 옵션에는 앞에 글자가 필요하지 않아야한다는 주장이 있습니다. 그것들은 위치 적 논증이된다. 그러나 이러한 인수가 여러 개인 경우 위치를 빨리 기억하기가 어려워집니다. –

관련 문제