Getopt::Long 코어 모듈
-
- 1. perldoc Getopt::Long 정리
-
-
- 1.1. 개요
-
- 1.2. 설명
-
- 1.3. 명령행 옵션 개요
-
- 1.4. Getopt::Long 시작하기
-
-
- 1.4.1. 간단한 옵션들
-
- 1.4.2. 조금 덜 간단한 옵션들
-
- 1.4.3. 옵션과 다른 인자들이 섞인 경우
-
- 1.4.4. 값을 받는 옵션들
-
- 1.4.5. 값이 여러 개인 옵션들
-
- 1.4.6. 해쉬 값으로 된 옵션들
-
- 1.4.7. 사용자 정의 서브루틴으로 옵션 처리하기
-
- 1.4.8. 이름이 여러 개인 옵션
-
- 1.4.9. 대소문자와 축약형
-
- 1.4.10. 옵션 명세 요약
-
1.5. 고급
-
-
- 1.5.1. 객체 지향 인터페이스
-
- 1.5.2. 쓰레드 안전
-
- 1.5.3. 문서화와 도움말
-
- 1.5.4. 임의의 배열로부터 옵션 추출
-
- 1.5.5. 임의의 문자열로부터 옵션 추출
-
- 1.5.6. 옵션 값들을 하나의 해쉬에 저장
-
- 1.5.7. 번들링
-
- 1.5.8. 단일 대쉬
-
- 1.5.9. 인자 콜백
-
1.6. Getopt::Long 설정하기
-
- 1.7. export 가능한 메쏘드
-
- 1.8. 리턴값과 에러
-
- 1.9. Legacy
-
-
- 1.9.1. 디폴트 옵션 변수
-
- 1.9.2. 옵션 시작 문자 대체
-
- 1.9.3. 설정 변수
-
1.10. 팁과 테크닉
-
-
- 1.10.1. 다수의 값을 해쉬 옵션에 차례로 저장하기
-
1.11. 문제 해결
-
-
- 1.11.1. 옵션을 주지 않았을 때 거짓을 반환하지 않아요!
-
- 1.11.2. 명령행에 적은 내용을 올바르게 분리하지 않아요
-
- 1.11.3. "Undefined subroutine &main::GetOptions called" 에러가 나요
-
- 1.11.4. "-?" 옵션을 넣으려면 어떻게 해야 하나요
-
2. 기타 & Comments
-
1. perldoc Getopt::Long 정리
Getopt::Long 내용 정리
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,
"file=s" => \$data,
"verbose" => \$verbose);
명령행 옵션을 처리하는 POSIX 문법과 GNU 확장을 지원하는 GetOptions() 함수 구현
1.3. 명령행 옵션 개요
전형적인 옵션들의 형태:
- 단일 대쉬 "-" + 문자 하나
- 단일 문자 옵션 묶음
- 값을 받는 옵션 - 옵션이름과 값 사이에 공백이 있을 수 있음
- 긴 이름 - 단일 문자 묶음과 구별하기 위해서 이중 대쉬 "--" 또는 플러스 "+" 사용
-
--long
- "+"는 구시대적. 사용하지 않는 것을 권함
- 긴 이름에 값이 있는 경우
1.4. Getopt::Long 시작하기
- 단일 문자 옵션 - 알파벳, 물음표, 대쉬 사용 가능
- 긴 이름 옵션 - 문자, 숫자, 대쉬들의 조합
- 대쉬로 끝날 수는 없음
- 따로 설정하지 않는다면, ("Getopt::Long 설정하기" 참조)
- 옵션 이름은 유일하게 식별가능한 한 줄여 쓸 수 있음
- 대소문자 구별 없음
- 싱글 대쉬 만으로 옵션임을 알릴 수 있음
- 옵션과 옵션이 아닌 인자들을 섞어서 배치할 수 있음
값이 없는 옵션들
예: --all --verbose --quiet --debug
my $verbose = '';
my $all = '';
GetOptions ('verbose' => \$verbose, 'all' => \$all);
^^^^^^^^^ ^^^^^ <-- 이 부분을 옵션 명세라 부름
@ARGV 에 있는 인자들 중에 해당 옵션이 있다면 변수의 값을 1로 설정. 없다면 아무 일도 안 함.
GetOptions은 명령행 처리가 성공하면 참을 반환. 그렇지 않을 경우 STDERR에 에러메시지를 출력한후 거짓 반환.
1.4.2. 조금 덜 간단한 옵션들
부정할 수 있는 (negatable) 옵션
- "!"로 표시
- 옵션 이름 앞에 "no"를 붙일 수 있음
-
--verbose
는 $verbose
변수를 1로 설정.
-
--noverbose
는 변수값을 0으로 설정
my $verbose = '';
GetOptions ('verbose!' => \$verbose);
증가할 수 있는 (incremental) 옵션
- "+"로 표시
- 옵션이 나올 때마다 변수 값을 1씩 증가시킴
my $verbose = '';
GetOptions ('verbose+' => \$verbose);
1.4.3. 옵션과 다른 인자들이 섞인 경우
기본적으로 Getopt::Long 은 옵션과 그 외 인자들이 섞여 있어도 옵션 부분만 추출해낸다. 대쉬 두 개 --
를 적어주면 Getopt::Long은 그 뒷부분의 인자를 처리하지 않는다.
--size 24 -- --all
- 위 예에서
--all
은 옵션으로 처리되지 않고 @ARGV
변수에 담긴채로 프로그램에 전달된다.
- 값이 필수적인지 선택적인지 명시:
- 필수적인 경우
=
표시
- 선택적인 경우
:
표시
- 값의 종류:
my $tag = '';
GetOptions ('tag=s' => \$tag);
- 값이 필수적인 경우, 옵션 바로 뒤에 있는 인자를 추출하여 옵션 변수에 할당
- 값이 선택적인 경우, 옵션 바로 뒤에 있는 인자가 올바른 옵션 자체가 아닌 걸로 판단되는 경우에 값으로 간주하여 할당
- 값에 주어지지 않을 경우, 문자열 값은 빈 스트링
''
으로, 숫자 값은 0
이 할당됨.
1.4.5. 값이 여러 개인 옵션들
하나의 옵션이 여러 개의 값을 받는 경우
예: --library lib/stdlib --library lib/extlib
- 옵션을 저장할 곳으로 배열의 레퍼런스를 적어주거나
- 옵션 명세에
@
를 적어주고 스칼라 레퍼런스에 저장
GetOptions ("library=s" => \@libfiles);
GetOptions ("library=s@" => \$libfiles);
여러 개의 값을 쉼표로 구분하여 받도록 하는 코드:
GetOptions ("library=s" => \@libfiles);
@libfiles = split(/,/,join(',',@libfiles));
(실험적인 기능)
한 번에 여러 개의 값을 받도록 하는 경우 (공백으로 구분)
예: --coordinates 52.2 16.4 --rgbcolor 255 255 149
- 값의 갯수를 중괄호에 넣어서 표시
{숫자}
- 최소 갯수와 최대 갯수를 명시할 수도 있음
foo=s{2,4}
- 한 개 이상의 값
foo=s{,}
- 0개 이상의 값
foo:s{,}
GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);
1.4.6. 해쉬 값으로 된 옵션들
옵션을 저장할 곳이 해쉬의 레퍼런스인 경우, 키=값
형태의 문자열을 값으로 받아들인 후에 해쉬에 저장한다.
GetOptions ("define=s" => \%defines);
GetOptions ("define=s%" => \$defines);
예: --define os=linux --define vendor=redhat
- 위 예에서 %defines 또는 %$defines 해쉬에는 "os"키와 "linux"값, "vendor"키와 "redhat"값이 저장됨
1.4.7. 사용자 정의 서브루틴으로 옵션 처리하기
옵션을 저장할 곳으로 서브루틴의 레퍼런스나 익명 서브루틴을 지정할 수 있다. 해당 옵션이 있을 경우 GetOptions()는 그 서브루틴을 호출하며, 인자 두 개 또는 세 개를 넘긴다.
- 첫번째 인자는 옵션의 이름 (정확히는 옵션 이름으로 stringify되는 오브젝트)
- 스칼라 또는 배열로 받아들이는 옵션의 경우 두번째 인자는 옵션 값
- 해쉬의 경우 두번째 인자는 해쉬 키, 세번째 인자는 값
두 옵션이 서로 연관되어 있는 예:
-
$verbose
변수의 값을 두 옵션이 서로 반대로 세팅한다.
my $verbose = '';
GetOptions ('verbose' => \$verbose,
'quiet' => sub { $verbose = 0 });
- 서브루틴에서 에러 상황을 알려야 할 때는 에러메시지를 인자로 하여 die()를 호출해야 한다. GetOptions()가 그걸 캐치하여 에러 메시지를 출력한다.
- 에러 메시지가 느낌표
!
로 시작하면 GetOptions()가 특별히 처리한다.
-
die("!FINISH")
- GetOptions()가 --
를 봤을 때처럼 더 이상 옵션을 처리하지 않고 멈춤
- 현재는 위 하나만 구현되어 있음
1.4.8. 이름이 여러 개인 옵션
사용자 편의를 위해, 옵션에 연상하기 쉬운 이름 여러 개를 동시에 부여:
- 세로바
|
로 이름들을 구분
-
--length
와 --height
두 개는 동일한 옵션
- 첫번째 이름이 주이름(primary name), 나머지가 별칭(aliases)
- 별칭을 두 개 이상 사용가능
- 해쉬로 저장하는 옵션의 경우, 키 부분은 항상 주이름이 사용됨
GetOptions ('length|height=f' => \$length);
별도로 설정하지 않은 경우 GetOptions()는
- 옵션 이름의 대소문자를 구분하지 않음
- 서로 고유하게 구분할 수 있을만큼은 축약가능
예:
GetOptions ('length|height=f' => \$length, "head" => \$head);
- length 옵션은
--l
과 --L
까지만 적어도 된다.
- head 옵션은
--hea
, height 옵션은 --hei
까지 적어야 한다.
각 옵션 명세는 두 부분으로 나뉜다: 이름 명세 부분과 인자 명세 부분
이름 명세 부분에는 옵션의 이름과, 추가적으로 별칭들이 세로선으로 구분되어 나열된다.
length 옵션 이름은 "length"
length|size|l 이름은 "length", 별칭은 "size"와 "l"
인자 명세 부분은 다음과 같은 것들이 올 수 있다:
- !
- 인자를 받지 않음
- "no" 또는 "no-"를 붙여서 반대 설정을 할 수 있음
- +
- 옵션이 사용될 때마다 1씩 증가
- 옵션을 저장할 곳이 스칼라가 아닐 경우 +는 무시됨
- = type [desttype] [repeat]
- 인자가 필요한 옵션
- type
- s - 임의의 문자열. 인자도
-
나 --
로 시작할 수 있음
- i - 정수. 플러스 또는 마이너스 기호가 앞에 올 수 있음
- o - Perl 스타일의 확장 정수. 플러스 또는 마이너스 기호가 앞에 올 수 있음. 그 뒤에 연속된 숫자, 팔진수(0으로 시작하고 0~7이 이어짐), 16진수(0x로 시작하고 0~9,a~f,A~F가 이어짐), 이진수(0b로 시작하고 0또는1이 이어짐)
- f - 실수.
3.14
, -6.23E24
등
- desttype
- @ - 리스트
- % - 해쉬
- 옵션을 저장할 곳에서 따로 명시되지 않았을 때만 필요
- repeat
- {[min][,[max]]} 형태
- 옵션 뒤에 오는 인자의 갯수를 명세
- min은 최소 갯수. 생략될 경우
=
뒤에서는 1, :
뒤에서는 0. 생략되지 않았을 경우는 =
/:
는 의미가 없어짐
- max는 최대 갯수. min보다 크거나 같아야 함. 쉼표는 있는데 max는 생략된 경우는 무한
- : type [desttype]
-
=
와 유사하나, 인자가 올 수도 있고 아닐 수도 있음. 인자가 생략된 경우 문자열 변수에는 빈 스트링이, 숫자형 옵션에는 0이 할당됨
- : 숫자 [desttype]
-
:i
와 유사. 값이 생략된 경우 숫자가 할당됨
- : + [desttype]
-
:i
와 유사. 값이 생략된 경우 해당 옵션 변수의 현재 값이 1증가
객체지향 방식으로 사용:
use Getopt::Long;
$p = new Getopt::Long::Parser;
$p->configure(...configuration options...);
if ($p->getoptions(...options descriptions...)) ...
옵션 설정을 객체 생성할 때 할 수도 있음
$p = new Getopt::Long::Parser
config => [...configuration options...];
Getopt::Long 은 Perl 5.8의 ithreads 를 사용하는 경우는 쓰레드 안전하다. 5.005에 추가되었던 오래된 쓰레드 구현을 사용할 경우는 그렇지 않다.
도움말 메시지를 출력하는데 Pod::Usage를 사용하도록 권장함: Pod::Usage 문서를 참조
use Getopt::Long;
use Pod::Usage;
my $man = 0;
my $help = 0;
GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
pod2usage(1) if $help;
pod2usage(-exitstatus => 0, -verbose => 2) if $man;
__END__
=head1 NAME
sample - Using Getopt::Long and Pod::Usage
=head1 SYNOPSIS
sample [options] [file ...]
Options:
-help brief help message
-man full documentation
=head1 OPTIONS
=over 8
=item B<-help>
Print a brief help message and exits.
=item B<-man>
Prints the manual page and exits.
=back
=head1 DESCRIPTION
B<This program> will read the given input file(s) and do something
useful with the contents thereof.
=cut
1.5.4. 임의의 배열로부터 옵션 추출
GetOptionsFromArray
함수를 사용하여, @ARGV
전역 배열이 아닌 임의의 배열에서 옵션 추출할 수 있다.
use Getopt::Long qw(GetOptionsFromArray);
$ret = GetOptionsFromArray(\@myopts, ...);
아래 두 줄은 동일한 동작을 한다:
$ret = GetOptions( ... );
$ret = GetOptionsFromArray(\@ARGV, ... );
1.5.5. 임의의 문자열로부터 옵션 추출
GetOptionsFromString
함수를 사용하여 임의의 문자열로부터 옵션을 추출할 수 있다.
use Getopt::Long qw(GetOptionsFromString);
$ret = GetOptionsFromString($string, ...);
- 스트링의 내용은
Text::ParseWords::shellwords
를 사용하여 인자들로 분리된다.
처리되지 않고 남는 인자가 있을 수 있음
- 리스트 문맥에서,
GetOptionsFromString
은 리턴 상태값과 남아있는 인자들의 배열의 레퍼런스를 반환한다.
- 남은 인자가 있는데 리스트 문맥에서 호출된 게 아닐 경우, 메시지가 출력되고 실패를 반환한다.
($ret, $args) = GetOptionsFromString($string, ... );
1.5.6. 옵션 값들을 하나의 해쉬에 저장
옵션이 많을 경우 각각을 개별적인 변수에 저장하는 건 불편하므로, 하나의 해쉬에 옵션값들을 저장할 수 있다.
- GetOptions()의 첫번째 인자로 해쉬 레퍼런스를 전달
- 각 옵션 이름이 키가 되고 옵션 값이 그 키에 해당하는 값이 됨
- 명령행에 명시되지 않은 옵션은 해쉬에 들어가지 않는다.
- 따라서 옵션이 사용되었는지를
exists($h{option})
또는 defined()
를 사용하여 검사할 수 있다.
-
use strict
를 사용할 경우 미리 검사하지 않고 $h{option}
을 사용할 경우 경고가 나올 수 있다.
my %h = ();
GetOptions (\%h, 'length=i');
리스트나 해쉬값을 받는 옵션의 경우는 타입 뒤에 @
나 %
를 붙여서 명시해야 함:
GetOptions (\%h, 'colours=s@');
옵션값이 실제로 저장될 변수의 레퍼런스를 해쉬에 담을 수도 있음:
my $len = 0;
my %h = ('length' => \$len);
GetOptions (\%h, 'length=i');
my $len = 0;
GetOptions ('length=i' => \$len);
자주 사용되는 옵션은 각각의 변수에 저장하고 나머지 옵션은 하나의 해쉬에 저장하는 식으로도 사용 가능하다:
my $verbose = 0;
my $debug = 0;
my %h = ('verbose' => \$verbose, 'debug' => \$debug);
GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
if ( $verbose ) { ... }
if ( exists $h{filter} ) { ... option 'filter' was specified ... }
- 여러 개의 단일 문자 옵션을 묶어서 표시 (예: a,v,x 옵션 세 가지를
-vax
로 표시)
- Getopt::Long::Configure 로 번들링 지원을 명시해주어야 함
- Getopt::Long에서는 두 단계의 번들링을 지원함
첫번째 단계
Getopt::Long::Configure ("bundling");
- 단일 문자 옵션들을 합칠 수 있음
- 긴 이름 옵션들은 반드시 이중 대쉬를 써서 나타내야 함
- 예: vax,a,v,x 옵션이 있을 경우
-vax
는 a,v,x를 세팅함. --vax
는 vax를 세팅함
두번째 단계
Getopt::Long::Configure ("bundling_override");
- 첫번째 단계의 제한을 없앰
-
-vax
는 vax 옵션을 세팅함
옵션 값들도 합쳐서 표시 가능
- 예:
-h 24 -w 80
을 -h24w80
으로 표시
번들링을 가능하게 설정할 경우, 단일 문자 옵션은 대소문자를 구별하고 긴 옵션은 구별하지 않는다. 단일 문자 옵션들도 대소문자를 구분하지 않게 하려면 다음과 같이 설정:
Getopt::Long::Configure ("bundling", "ignorecase_always");
- 기본적으로는, 명령행에 대쉬 하나만 단독으로 있는 경우는 옵션으로 간주되지 않고, @ARGV에 남아 있는다.
- 단일 대쉬를 옵션으로 인식하도록 하려면 옵션 이름을 빈 문자열로 지정하라
GetOptions ('' => \$stdio);
- 옵션 이름 중 특별히
<>
를 사용하여, 옵션이 아닌 인자를 처리하는 서브루틴을 지정할 수 있다.
- GetOptions()는 옵션으로 간주되지 않는 인자를 보면 즉시 그 서브루틴을 호출하면서 인자의 이름을 파라메터로 전달한다. (정확히는 인자의 이름으로 stringify되는 오브젝트)
- 이 기능을 쓰려면 permute 설정이 되어 있어야 한다.
my $width = 80;
sub process { ... }
GetOptions ('width=i' => \$width, '<>' => \&process);
위처럼 작성한 상황에서 명령행 인자를 아래와 같이 줄 경우, 다음과 같은 순서대로 처리된다.
arg1 --width=72 arg2 --width=60 arg3
-
$width
값이 80
인 상태에서 process("arg1")
호출
-
$width
값이 72
인 상태에서 process("arg2")
호출
-
$width
값이 60
인 상태에서 process("arg3")
호출
1.6. Getopt::Long 설정하기
Getopt::Long::Configure()를 사용하여 Getopt::Long의 동작을 설정할 수 있음
- 인자로는 인용처리된 문자열들의 리스트를 받으며, 각 문자열은 설정 옵션을 켜거나 (
ignore_case
) 끄는 (no_ignore_case
) 기능을 함.
- 인자의 대소문자 구분하지 않음
- Configure()를 여러번 호출할 수 있음
또는,2.24부터는 use
구문에서 설정 옵션을 전달할 수 있음:
use Getopt::Long qw(:config no_ignore_case bundling);
사용 가능한 옵션들:
- default
- posix_default
- POSIXLY_CORRECT 환경변수가 세팅되어 있는 것처럼 간주하고 모든 설정값을 이 때의 디폴트 값으로 리셋
- auto_abbrev
- 옵션 이름을 축약할 수 있음.
- 기본값 on
- POSIXLY_CORRECT가 세팅되어 있는 경우 기본값 off
- getopt_compat
- 옵션 앞에
+
사용가능
- 기본값 on
- POSIXLY_CORRECT가 세팅되어 있는 경우 기본값 off
- gnu_compat
-
--opt=
형태의 옵션을 허용.
-
gnu_compat
가 켜져 있는 상태에서는 opt
옵션에 빈 값(empty value)을 할당
- gnu_getopt
-
gnu_compat
bundling
permute
no_getopt_compat
옵션들을 전부 설정한 것과 동일
- GNU getopt_long()과 완전히 호환되는 상태
- require_order
- 인자와 옵션이 섞여 쓰일 수 없음. 즉 옵션들이 먼저 나열되고 그 후에 인자가 와야 함
- 기본값 off
- POSIXLY_CORRECT가 세팅되어 있는 경우 기본값 on
-
permute
옵션과 반대 역할
- permute
- 인자와 옵션이 섞여 쓰일 수 있음.
- 기본값 on
- POSIXLY_CORRECT가 세팅되어 있는 경우 기본값 off
-
require_order
옵션과 반대 역할
- 예:
--foo arg1 --bar arg2 arg3
는 --foo --bar arg1 arg2 arg3
와 동등
- 인자 콜백이 명시된 경우는 모든 옵션과 인자가 다 처리되므로, 성공적으로 GetOptions()가 수행됐을 경우
@ARGV
배열은 비어 있게 된다. 유일한 예외는 --
가 사용됐을 경우이다:
- 예:
--foo arg1 --bar arg2 -- arg3
- 이 때는 arg1과 arg2를 각각 인자로 하여 콜백 루틴을 호출하고,
"arg3"
은 @ARGV
에 남은 상태에서 GetOptions()의 수행은 끝남
-
require_order
가 세팅된 경우는, 옵션이 아닌 인자 중 첫번째 인자를 만났을 때 수행이 종료됨
- 예:
--foo arg1 --bar arg2 arg3
는 --foo -- arg1 --bar arg2 arg3
과 동등
-
pass_through
옵션이 같이 켜져 있을 경우는, 명시되지 않은 옵션과 옵션이 아닌 인자 중 먼저 오는 것을 만나는 시점에 수행이 종료됨
- bundling
- 기본값 off
- 단일 문자 옵션들을 한번에 묶어서 표시하는 것을 허용
- 단일 문자들의 묶음과 긴 이름 옵션을 구분하기 위하여, 긴 이름 옵션은
--
로, 옵션 묶음은 -
로 시작해야 함
-
a
, l
, all
옵션들이 있고, auto_abbrev 가 켜져 있을 경우, 각 형태의 인자들이 대응되는 옵션은 다음과 같다:
using argument sets option(s)
------------------------------------------
-a, --a a
-l, --l l
-al, -la, -ala, -all,... a, l
--al, --all all
-
--a
가 all
이 아니라 a
옵션을 세팅하는 것에 유의
- bundling_override
- 기본값 off
-
bundling
과 같으나, 긴 이름의 옵션을 -
뒤에 표시할 수 있음. 이 경우 옵션 번들로 간주되지 않음
- ignore_case
- 기본값 on
- 옵션 이름을 대조할 때 대소문자 구분 안 함
- bundling이 켜져 있을 경우는 단일 문자 옵션에 한해서 대소문자 구분을 함
- ignore_case_always
- bundling이 켜져 있어도, 단일 문자 옵션도 대소문자 구분하지 않음
- auto_version
- 기본값 off
- --version 옵션이 따로 명시되지 않은 경우, 이 옵션이 있으면 다음 항목들을 포함하는 표준 버전 메시지를 제공함
- 프로그램 이름
- 프로그램 버전 ($main::VERSION 이 정의된 경우)
- Getopt::Long과 Perl의 버전
- auto_help
- --help -? 옵션이 있으고 프로그램에서 따로 명시되어 있지 않은 경우, Pod::Usage 모듈을 사용한 도움말 메시지를 제공
- pass_through
- 기본값 off
- 명시되지 않은 옵션, 어느 옵션인지 모호한 경우, 또는 옵션에 잘못된 값이 전달된 경우 에러로 처리하지 않고
@ARGV
에 남김
-
requier_order
가 같이 설정된 경우는 명시되지 않은 옵션과 옵션이 아닌 인자 중에 먼저 나타난 것을 만났을 때 수행 종료
- 옵션 종료 지시자
--
도 @ARGV
에 전달됨
- prefix
- prefix_pattern
- 옵션임을 알 수 있게 앞에 붙는 문자열의 패턴
- 기본값은
--|-|\+
- POSIXLY_CORRECT가 세팅되어 있는 경우 기본값은
--|-
- long_prefix_pattern
- 긴 이름 옵션임을 알 수 있게 앞에 붙는 문자열의 패턴
- 기본값은
--
- debug
1.7. export 가능한 메쏘드
VersionMessage
- 기본적인 버전 안내 메시지 출력
- 인자는 다음 세 가지 중 하나
- 기본 메시지가 출력되기 이전에 출력될 텍스트 메시지 문자열
- 원하는 종료 상태값을 나타내는 숫자
- 해쉬 레퍼런스
- 인자가 둘 이상일 경우는 전체 인자 리스트가 해쉬로 간주됨. 인자가 해쉬 또는 해쉬 레퍼런스로 주어질 경우 다음 항목 중 하나 이상이 있어야 함
-
-message
또는 -msg
- 기본 메시지가 출력되기 이전에 출력될 텍스트 메시지 문자열
-
-exitval
- exit()에 전달될 종료상태값. 정수값
- 값으로 "NOEXIT"을 전달하면 프로그램이 종료하지 않고 계속 진행하도록 함
-
-output
- 메시지가 출력될 파일핸들 레퍼런스 또는 파일의 경로명
- 기본값은, 종료상태값이 2 이상이면
\*STDERR
, 2보다 작으면 \*STDOUT
HelpMessage
- Pod::Usage를 사용하여, 프로그램의 /POD의 SYNOPSIS 섹션의 내용으로부터 도움말을 구성하여 출력
- VersionMessage()와 동일한 인자를 받음
위 두 함수는 GetOptions()에서 직접 지정할 수 없음. 익명 서브루틴 안에 넣어서 사용하라
GetOptions("version" => \&VersionMessage);
GetOptions("version" => sub { VersionMessage() });
GetOptions("help" => \&HelpMessage);
GetOptions("help" => sub { HelpMessage() });
설정 과정이나 옵션을 정의할 때 에러가 발생할 경우 die()를 통해 에러를 알리고 프로그램은 종료된다.
GetOptions()은 성공적으로 수행될 경우 참을 반환. 옵션 추출 과정에서 에러가 발생하면 에러 내용을 warn()을 통해 경보하고 거짓을 반환한다.
Perl4의 newgetopt.pl
시절 제공되었다가 하위호환성 유지를 위해 여전히 제공되는 기능들.
옵션값 저장위치를 지정하지 않을 경우는 opt_XXX
(XXX는 옵션의 주이름)라는 전역변수에 옵션값을 저장함.
our $opt_length = 0;
GetOptions ('length=i');
-
use strict;
를 사용할 경우 이 변수들은 our()또는 use vars
를 사용하여 미리 선언되어야 함
- Perl의 변수에 사용할 수 없는 문자가 옵션에 있을 경우는 언더스코어로 치환됨
- 예:
--fpp-struct-return
은 $opt_fpp_struct_return
변수에 대응
GetOptions ("size=i", "sizes=i@");
- 위 코드에 "-size 10 -sizes 24 -sizes 48"이라는 옵션이 주어질 경우는 다음과 같이 할당됨
$opt_size = 10;
@opt_sizes = (24, 48);
옵션 이름 앞에 적는 문자("-"와 같은)를 다른 것을 사용하고 싶을 경우 그 문자를 첫번째 인자(또는 해쉬 레퍼런스 인자 바로 뒤에 두번째 인자)로 전달
my $len = 0;
GetOptions ('/', 'length=i' => $len);
사용예: /length 24 -- arg
- 옵션 처리를 종료시키는 것은 이 때도 이중 대쉬
--
임에 유의
Getopt::Long 구버전에서는 동작 설정을 위해 변수를 사용했었음. 현재도 가능하나, Configure
를 사용할 것을 강력하게 권장함
1.10.1. 다수의 값을 해쉬 옵션에 차례로 저장하기
해쉬와 배열의 장점을 결합하여, 명령행이 다음과 같을 때
--list add=first --list add=second --list add=third
각각의 'list add'의 값이 배열 레퍼런스 $list->{add} 에 차례로 저장되어 다음과 같이 결과가 나오게 하고 싶은 경우:
$list->{add} = [qw(first second third)];
옵션 저장지를 다음 서브루틴으로 하여 구현가능:
GetOptions('list=s%' =>
sub { push(@{$list{$_[1]}}, $_[2]) });
1.11.1. 옵션을 주지 않았을 때 거짓을 반환하지 않아요!
그것이 'options'라 불리는 이유입니다.
1.11.2. 명령행에 적은 내용을 올바르게 분리하지 않아요
명령행을 분리하는 건 GetOptions가 아니라 명령행 인터프리터(CLI)입니다. Unix에서는 shell, 윈도우에서는 COMMAND.COM또는 CMD.EXE, 다른 운영체제에서는 또다른 CLI가 있죠.
명령행에 특수 문자, 특히 따옴표나 백슬래쉬가 포함된 경우, CLI들의 동작이 서로 다를 수 있다는 점이 중요합니다. 예를 들어 Unix 쉘에서는 작은따옴표('
)나 큰따옴표("
)를 사용해 단어들을 하나의 그룹으로 묶을 수 있습니다. 다음 세 가지는 Unix에서 다 동일한 의미입니다:
"two words"
'two words'
two\ words
잘 모르겠으면, 다음 구문을 당신의 펄 프로그램 앞에 삽입해서 당신이 사용 중인 CLI가 인자를 어떻게 프로그램에 넘겨주는지를 검증하세요:
print STDERR (join("|",@ARGV),"\n");
1.11.3. "Undefined subroutine &main::GetOptions called" 에러가 나요
MS윈도우를 사용중이고, 다음과 같이 적지 않았나 보세요: (대문자 'O')
use GetOpt::Long;
1.11.4. "-?" 옵션을 넣으려면 어떻게 해야 하나요
Getopt::Long 버전이 2.13이상이어야 하고, 별칭으로만 넣을 수 있습니다:
use Getopt::Long;
GetOptions ("help|?");
2. 기타 & Comments
컴퓨터분류 Perl