2012-12-11 2 views
0

인수가있는 Perl 스크립트가 있습니다. 내가 단일 값 인수를했을 때, 다음 코드는 충분했다 :정규식을 기반으로 한 Perl 인수 스위치

    switch ($ARGV[0]) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 


        case "--cmd2" { 
          $action = "cmd2"; 
        } 

지금, 내가 명령, cmd3--cmd3=SOMETHING 같이 매개 변수가있는 경우가 있습니다. SOMETHING은 다를 수 있으므로 간단한 스위치/케이스가 더 이상 작동하지 않습니다. 기본적으로 명령 자체에서 스위치/대문자를 사용해야합니다. 첫 번째 일치하는 그룹이 명령이고 두 번째가 옵션 equals 인 정규식을 사용할 수 있다고 생각했습니다. 다음은 작동하지 않지만 내가하려고하는 것을 보여줍니다.

    $ARGV[0] =~ m/(.*?)(=.*){0,1}/; 
        my $cmd = $1; 
        my $equals = $2; 

        switch ($cmd) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 

        case "--cmd2" { 
          $action = "cmd2"; 
        } 

        case "--cmd3" { 
          $action = "cmd3"; 
          print $equals; 
        } 

::::::::::::::::::::::::::::::::::: 편집 ::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::

나는 그것을 알아 냈다. 그러나 나는 upvotes에 대답하고 어떻게해서든지 받아들이는 사람에게 줄 것이다. 나는 모든 것을 재구성한다는 것을 의미하기 때문에 나는 사용할 수 없다. 여기에 해결책이 있습니다.

    switch ($ARGV[0]) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 

        case "--cmd2" { 
          $action = "cmd2"; 
        } 

        case m/--cmd3(=.*)?/ { 
          $ARGV[0] =~ m/--cmd3(=.*)?/; 
          $action = "cmd3"; 
          print $1; 
        } 
+8

'Getopt :: *'을 사용하지 않는 이유는 무엇입니까? –

+2

해시 키를 리터럴 명령 이름으로 사용하고 코드 참조를 해시 값으로 사용하여 가능한 명령을 디스패치 테이블에 넣습니다. 그런 다음 패턴 일치 후에 "$ dispatch {$ 1} -> ($ 2)'" – DavidO

+3

Perl의 스위치가 (더 이상 사용되지 않는) 소스 필터 해킹이라고 말할 수 있습니다. given/when, for/when이 아마 더 나을지도 모르지만, 나는 이런 식으로 해시 기반의 디스패치를 ​​사용하는 것을 선호합니다. – DavidO

답변

1

어때?

my $cmd = ""; 
my $equals = ""; 

if($ARGV[0] =~ m/^\-\-cmd1$/){$cmd="cmd1"} 
if($ARGV[0] =~ m/^\-\-cmd2$/){$cmd="cmd2"} 
if($ARGV[0] =~ m/^\-\-cmd3=(.*)$/){$cmd="cmd3";$equals=$1} 
+0

내 실수는 있지만 cmd3의 같음은 선택 사항입니다. --cmd3 및 --cmd3 = SOMETHING은 다른 결과를 산출하며 둘 다 유효합니다. 그래도 동의를 유지할 수 있습니다. – user974896

+0

"hacky"에 신경 쓰지 않는다면이 줄을 쉽게 추가하여'cmd3'의 다른 형식을 캡처 할 수 있습니다 : if ($ ARGV [0] = ~ m/^ \ - \ cmd3 $ /) {$ cmd = "cmd3"}' –

+2

정규 표현식에서'-' 문자를 이스케이프 할 필요가 없습니다. 또한 정규식 기능을 사용하지 않으므로 처음 두 개는 실제로 if ($ ARGV [0] eq '- cmd1')'이어야합니다. –

5

Getopt::Long을 사용하고 있지 않습니까?

+0

시스템은 이미 인수를 수동으로 구문 분석하여 작성되었습니다. 변경할 수 없습니다. 나는이 추가 기능을 추가하는 중이다. – user974896

+0

그래서'Getopt :: Long'을 사용할 수 있습니다. – mpe

관련 문제