2012-10-09 8 views
2

것은, Getopt :: 긴 익명 서브 루틴 : 나는 --version 또는 --help와 스크립트를 호출하는 경우나는 다음과 같은 코드를 작성했습니다

my $version = sub { 
    print "$PROGNAME $VERSION - $AUTHOR\n"; 
    exit 0; 
}; 

my $usage = sub { 
    print "Usage: proll <options>\n"; 
    print "Available options:\n"; 
    print " -h, --help Print this help and exit.\n"; 
    print " --version Print version.\n"; 
    print " XdY  Launch X dice with Y faces.\n"; 
    exit 0; 
}; 

my $ret = GetOptions ("version" => \$version, 
         "h|help" => \$usage); 

그러나 또한이 서브 루틴을 호출하지 않습니다. 내가 어디서 잘못한거야?

다음과 같이 내가 코드를 변경하는 경우, 항상 명령 줄 매개 변수없이 또한 첫 번째 서브 루틴을 호출 :

my $ret = GetOptions ("version" => &$version, 
         "h|help" => &$usage); 
+1

도 참조 http://perldoc.perl.org/Pod/Usage.html – toolic

답변

7

\$version$version 익명 서브 루틴에 대한 참조입니다 $version에 대한 참조입니다; 그래서 \$version은 서브 루틴에 대한 참조입니다. 그건 너무 간접적입니다. 당신은 참조 다움의 단일 레벨이 필요합니다

my $ret = GetOptions ("version" => $version, 
         "h|help" => $usage); 
+1

또한, 그것은 단지 전화를받을 것입니다 매우 짧은 서브 루틴의 경우 명령 줄에 전달 된 옵션을 기반으로 익명 서브 루틴 인'GetOptions ("dostuff"=> sub {[do stuff here}});'를 사용하면됩니다. 한 번에 여러 변수를 설정하거나 객체를 특별한 방법으로 인스턴스화하는 데 유용합니다. –

+0

대단히 고마워, 효과가 있었다. 그냥 알기 만하면 : 참조가 필요하다면, 끝을 찾을 때까지 참조 "스트림"을 따르지 않는 이유는 무엇일까요? – Zagorax

+0

@Zagorax :'GetOptions'에는 몇 가지 다른 호출 규칙이 있습니다 ([documentation] (http://perldoc.perl.org/Getopt/Long.html) 참조). * 당신이 그것을 사용할 수있는 한가지 방법은 당신이 그것을 사용하는 방법이다. 옵션이 존재할 때 호출 할 서브 루틴에 대한 참조를 전달하지만 참조를 전달하는 다른 방법이있다. 옵션의 값으로 설정되어야하는 스칼라에. 참조가 스칼라 유형이기 때문에'\ $ version'은 후자의 호출 규칙을 트리거하므로'GetOptions'는 변수'$ version'에 저장된'--version'의 값을 원한다고 생각합니다. – ruakh

관련 문제