2011-12-13 4 views
2

설정 스크립트에서 인수를 처리하기 위해 Getopt :: Long을 설정하려고합니다.또한 옵션 인 서브 루틴에 Getopt :: Long 옵션을 전달할 수 있습니까?

내 시동기입니다. 내가 좋아하는 그것을 실행하는 경우

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 

my $config_file = ''; 

GetOptions (

    'config|c=s' => \$config_file, 
    'add|a' => \&add_server, 
    'del|d' => \&del_server, 

); 

sub add_server { 

print "$config_file\n"; 

} 

sub del_server { 

# Left blank for now. 

} 

나는 이런 식으로 뭔가 내 스크립트를 실행할 때 이상한 것은 내가 문제로 실행하고있다가,

./config.pl -a -c config.xml

그것은 -c 옵션을 인쇄,하지만하지 않습니다 이것은

./config.pl -c config.xml -a

그것이해야처럼 작동합니다.

이유가 무엇인지 이해하고 있다고 생각합니다. 주문 실행 권한과 관련이 있습니다.

문제는 어떻게 해결할 수 있습니까? @ARGV와 함께 Getopt :: Long을 사용해야합니까?

궁극적으로 나는 args가 내가 부르고있는 서브 루틴으로 넘어가려고 노력하고있다. 따라서 -a or --add이라면 -c or --config의 옵션을 호출 할 때 서브 루틴으로 전달하기를 원합니다.

아이디어가 있으십니까?

답변

-1

Getopt :: Long에 대해 pass_through 옵션을 사용하도록 설정하여 알 수없는 옵션을 무시한 다음 옵션에 대해 GetOptions를 한 번 호출하고 다시 사용하지 않도록 설정 한 다음 다시 GetOptions를 사용하십시오. 조금 아래로 예를 끓는

+0

내가이 좋네요를 포맷합니다 (A 전화 하나에 게시 전자는 가장 쉽지 않습니다.) –

0

...

use strict; 
use warnings; 
use Getopt::Long; 

my $config_file = ''; 

GetOptions (

    'config|c=s' => \$config_file, 
    'add|a' => sub{add_server($config_file);} 
); 

sub add_server 
{ 

    my $config=shift; 

    if(defined($config)) 
    { 
     print "Got this for a config file: $config\n"; 
    } 
    else 
    { 
     print "No argument supplied to add_server\n"; 
    } 

} 

... 그리고 config.pl -c blurg -a 반환 출력 Got this for a config file: blurg을 실행하고, config.pl -a -c blurg 반환 Got this for a config file:를 실행.

그럼 제가 생각한 것은 옵션이 주어진 순서대로 할당된다는 것입니다. 따라서 첫 번째 경우 $config_file-c 인수에 할당되고 add_server 서브 루틴이 올바른 인수와 함께 호출됩니다. 두 번째 경우에는 add_server이 즉시 인수없이 실행되고 $config_file이 할당됩니다.

이 모든 것을 제외하고는 -a을 부울 값으로 설정하고 활성화 된 경우 (그리고 -c에 대한 인수가 제공된 경우) 원하는대로 수행 할 것을 권장합니다.

+1

Re : "옵션을 서브 루틴의 코드 참조에 직접 연결할 수 없습니다." 완전히 거짓. 코드 ref는 코드 ref입니다. – ikegami

+0

@ikegami - 더 읽을 때 그것은 수출 가능한 메시지에만있는 것처럼 보입니다. 수정. –

3

GetOptions 호출에서 직접 서브 루틴을 호출 할 필요가 없습니다., 최신 정보를 바탕으로

./config.pl -a -c config.xml 

을 수행 할 때 발생했습니다 당신을

use strict; 
use warnings; 
use Getopt::Long; 

my %opts = (config => ''); 

GetOptions(\%opts, qw(
    config|c=s 
    add|a 
    del|d 
)); 

add_server() if $opts{add}; 
del_server() if $opts{del}; 

sub add_server {  
    print "$opts{config}\n"; 
} 

sub del_server {} 
0

옵션이 발생하는대로 콜백이 호출되므로 add_server-c 전에 호출되고이 같은 순서를 제어 지금 원하는 : 나는 집에 도착하면

use Getopt::Long qw(GetOptions); 

GetOptions(
    'a=s' => \my $opt_a, 
    'd=s' => \my $opt_d, 
    'h=s' => \my $opt_h, 
    'p=s' => \my $opt_p, 
) or usage(); 
+0

하나의 설정 파일 만 지정하면됩니다. – ianc1215

+1

@Solignis, 왜'-a config.xml'을 쓰지 않을까요? – ikegami

+0

@Solignis, 이것이 20 개의 질문 게임이되기 전에 원하는 인터페이스를 지정하지 않는 이유는 무엇입니까? – ikegami

0
GetOptions(
     'arg=s' => sub { print "$_[1]\n"; }, 
); 
+0

코드 작동 방식에 대한 설명을 게시하는 것이 좋습니다 – DNKROZ

+1

죄송합니다. 자체적으로 설명 할 것이라고 생각했습니다. 'GetOptions()'함수는 매개 변수 배열'@ _ '을 인수 action으로 참조되는 whatever_you_like 함수에 전달합니다. 배열은 $ _ [0]에있는 인수의 전체 이름 ('arg')과 $ _ [1]에있는 값을 포함합니다. – hugg