문제의 역사:
Perl의 가장 초기 버전부터 변수 @ARGV는 명령줄 인수 목록을 제공했습니다. 그러나 수동 파싱은 오류를 일으키기 쉬웠습니다. 가독성과 유연성을 높이기 위해 Getopt::Std 모듈이 등장했고, 나중에 Getopt::Long 및 외부 CPAN 모듈(예: MooX::Options, Getopt::Euclid)이 개발되었습니다.
문제:
“수동” 파싱은 종종 음수, 필수 및 복수 플래그, 공백이 있는 매개변수를 고려하지 않습니다. 다양한 구문 형식(--flag=value, -abc, 혼합된 위치)은 스크립트를 비우호적으로 만들고 인수 순서 변경 시 쉽게 망가질 수 있습니다.
해결책:
옵션 및 플래그에 대한 고급 파싱을 위해 Getopt::Long을 사용합니다. 이 모듈은 긴/짧은 옵션, 옵션 자동 감지, 배열, 해시 및 다양한 플래그 형식을 지원합니다. 매우 복잡한 CLI 인터페이스의 경우 CPAN 모듈을 사용해 매개변수를 선언적으로 설명할 수 있습니다(MooX::Options, MooseX::Getopt).
코드 예제:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose is $verbose Count is $count Files: @files ";
주요 특징:
Getopt::Std만 사용할 경우 위치 인수를 선택적 인수와 구별하는 방법은 무엇인가요?
Getopt::Std는 긴 이름의 명명된 옵션을 처리하거나 자동으로 위치 인수를 분리할 수 없습니다. 짧은 플래그를 파싱한 후 위치 인수는 @ARGV에 있지만 복잡한 구문 지원에는 수동 작업이 필요합니다.
Getopt::Long과 Getopt::Std의 주요 차이점은 무엇인가요?
Getopt::Std는 짧은(한 문자) 옵션만 처리할 수 있는 반면, Getopt::Long은 긴 플래그, 값 유형, 배열/해시를 파싱할 수 있으며 비문자 키를 지원합니다.
STDIN을 통해 매개변수를 받을 수 있나요, 아니면 @ARGV를 통해서만 받을 수 있나요?
네, 하지만 Getopt::Long의 표준은 아닙니다. 혼합된 CLI 및 STDIN 입력의 경우 수동으로 STDIN을 읽고 이 입력을 파싱 로직에 통합해야 합니다.
스크립트가 @ARGV의 각 인수를 수동으로 반복하며 --arg 이후의 값을 잊거나, --에 대한 처리가 잘못되거나, 음수 처리에서 오류가 발생(예: -5가 플래그로 처리됨).
장점:
단점:
모든 변수를 파일의 시작 부분에서 간단히 설명하여 Getopt::Long을 사용하는 사례. 배열, 필수 여부, 형식 검증 및 도움말 출력을 지원합니다.
장점:
단점: