2016-06-01 10 views
3

:: 롱 버전 2.39은 내가 -c를 사용하는 경우 기본값은 %opts 20 넣어 될 것이라고 표시하기 위해어떻게 펄의 것은, Getopt에서

use Getopt::Long qw(:config gnu_getopt); 
GetOptions(
    \my %opts, 
    "codon-view|c:20", # Optional value, default 20 
    "consensus|C:50", 
    ... 
) 

를 사용할 수있는 기본 옵션 값을 설정 할 codon-view의 경우 -c이 주어졌지만 명시적인 값이없는 경우 해당 키가 있습니다. 반면에 -c 또는 --codon-view이 제공되지 않으면 해시 테이블의 값은 %opts에 저장되지 않습니다. 이것은 더 이상 나는 내가 이전 동작을 달성 할 수있는 방법 Getopt::Long's documentation

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.39 
20 

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

에 2.48에서

를 참조하지 않는 작품?

도움말!

+0

2.39에서 작동 했습니까? 2.24 (2000 년에 발표 됨), [값이있는 옵션에 대한 문서] (https://metacpan.org/pod/release/JV/Getopt-Long-2.24/lib/Getopt/Long.pm# Options with-values)는'tag = s' 또는'tag : i'가 아닌'tag = s' 형식의 옵션 사양을 일관되게 보여줍니다. – ThisSuitIsBlackNot

+0

게시물을 수정하여 수정했습니다. 당신이 얻는 것은 내 행동과 일치합니다. '-c' 나'--codon-view'가 주어지면 그 행동은 2.39와 2.48 사이에서 변화합니다. 또한 'gnu_getopt'와 관련하여 두 버전 사이에서 변경되는 FindOption의 변경 사항이 있습니다. – rocky

+1

@ThisSuitIsBlack 아니요, ': number'로 검색 – ikegami

답변

5

변경 사항은 2.48에서 소개되었습니다.

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.47 
20 

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

잘 모르겠지만, 나는 그것이 실수로 이루어졌다 생각, 그래서 bug report을 제기했다.


use Getopt::Long qw(:config gnu_getopt); 

gnu_compat를 사용하여 당신이 투자하는 방법

use Getopt::Long qw(:config gnu_compat bundling permute no_getopt_compat); 

의 약자입니까?

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

$ perl -E' 
    use Getopt::Long qw(:config gnu_compat bundling permute no_getopt_compat); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

$ perl -E' 
    use Getopt::Long qw(:config bundling permute no_getopt_compat); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
20 

gnu_compat 컨트롤 --opt= 여부를 허용, 그것은 무엇을해야하는지. gnu_compat이 없으면 --opt=에 오류가 있습니다. gnu_compat으로 --opt=은 옵션 opt과 빈 값을 제공합니다. 이것이 GNU getopt_long()이하는 방법입니다.당신이 --codon-view=$opts{"codon-view"}에 제로를 지정하여 확인 인 경우

그래서, 단순히 여기에 또 다른 가능하지만, 덜 좋은 솔루션입니다

use Getopt::Long qw(:config bundling permute no_getopt_compat); 

대신

use Getopt::Long qw(:config gnu_getopt); 
+0

이것은 유용성의 문제이므로 사용자에게 실험을 요청해야합니다. 지금 내가 한 것은 모듈에 복사 된 2.39 코드를 사용하는 것입니다. 당신이 말하는 것을 감안할 때, 나는 버전을 2.47 정도까지 올릴 수 있다고 생각합니다. – rocky

+0

다시보십시오. 내 솔루션은 사용자에게 영향을주지 않습니다. 단순히'--opt ='stop이 에러를 던지게한다. – ikegami

+0

'gnu_compat'의 문서가 잘못되어있는 것처럼 보입니다. 'perl -MGetopt :: Long = : config, gnu_compat -E'GetOptions (\ % opts, "foo : 1") 또는 죽습니다. "<$opts{foo}>"이라고 말하십시오. - --foo ='prints '<0>'; 'gnu_compat'를 제거하면 (오류를주지 않고)'<1>'이 출력됩니다. – ThisSuitIsBlackNot

3

GetOptions() 호출 전에 기본값을 설정하십시오. 옵션이 명령 행에 제공되지 않으면 기본값을 겹쳐 쓰지 않습니다.

$ perl -MGetopt::Long -E '$c=20;GetOptions("c=i"=>\$c); say $c' -- -c 14 
14 

$ perl -MGetopt::Long -E '$c=20;GetOptions("c=i"=>\$c); say $c' -- 
20 

Getopt::Long 문서에 a trivial example 있습니다.

+0

이전 행동에 대해서는 명확하지 않았던 것 같습니다. '-c'가 주어지지 않으면 그 키는 해시에 있지 않습니다. 설정되어있는 경우에만 해당 키의 값이 기본값을 갖습니다. 나는 이것을 반영하기 위해 나의 질문을 편집 할 것이다. – rocky

0

내가 해시 내 OPTS을 할당 좋아 .. 이제 사용자가 $opt{c} 키가 생성하지만, 값이 undef 인의 도착, 인수없이 ./you-app -c 실행하는 경우

GetOptions(\ my %opt, 
    'codon-view|c:i', 
); 

if (exists $opt{'codon-view'}) { 
    print "User triggered '-c' flag\n"; 
    $opt{'codon-view'} ||= 20; 
    printf("codon-view: %d\n", $opt{'codon-view'}); 
} 

당신이 많은 체크를하면 이렇게 exists으로 시작되었습니다.

연산자는 왼쪽이 falsey (대개 undef) 인 경우에만 왼쪽에 오른쪽을 할당합니다. 주의해야 할 점은 누군가가 -c 0을 지정하면 기본값을 할당합니다 ...하지만 계속 진행하고 0이 아마도 플래그에 대한 잘못된 인수라고 가정 할 것입니다.

+0

죄송합니다. 내 상황을 완전히보고하지 않았습니다. 첫째, 네, 옵션 해시를 사용합니다. 또한,'use Getopt :: Long qw (config gnu_getopt); '를 사용합니다. gnu_getopt가 use 문에 지정되지 않은 경우 예제가 작동합니다. 그러나 이것이 지정되면 예제는 더 이상 작동하지 않습니다. 또한 좀 더 성가시고'codon-view | c : 20'이하는 것을 두 장소에 넣습니다. gnu_getopt가 지정되었을 때 우리가 문제를 해결할 수 있다면, 더 나은 해결책이 없다면 이것을 받아 들일 것입니다. – rocky

1

사용의 사본을 포함 Getopt :: Long.pm, 단 하나의 파일이지만 패키지 네임 스페이스를 다른 것으로 변경했습니다. MyPackage :: GetoptLong.

이것은 이상적인 대답은 아니지만 호환성을 유지하기 위해 무언가가 필요하고 더 나은 ikegami 솔루션이 없다면 명심해야 할 사항입니다.