명령줄 인수 처리 - Perl 프로그램의 기본 작업입니다. 역사적으로 Perl은 스크립트에 전달된 인수에 접근하기 위해 변수를 @ARGV로 제공했습니다. 문제는 복잡한 시나리오가 플래그 및 키-값 매개변수를 포함할 수 있어 @ARGV 배열을 수동으로 파싱해야 한다는 것입니다. 잘못된 접근 방식으로 인해 매개변수를 잘못 처리하거나 필수 값을 놓치거나 여분의 값을 처리하여 프로그램 로직에 오류가 발생할 수 있습니다.
해결책은 체계적인 처리를 사용하는 것입니다: @ARGV를 통해 반복하고, 내용을 분석하고, 키와 값을 처리하는 것입니다.
코드 예시:
my %args; while (my $arg = shift @ARGV) { if ($arg =~ /^--(\w+)=?(.*)/) { my ($key, $val) = ($1, $2); if ($val eq '' && @ARGV) { $val = shift @ARGV; # 다음 값 } $args{$key} = $val eq '' ? 1 : $val; } else { push @{$args{'_free'}}, $arg; } } print "Got foo: $args{foo} " if exists $args{foo};
주요 특징:
인수가 '--flag value' 형식으로 전달되면 어떻게 되나요?
'='를 기준으로 분리할 경우 값은 빈 문자열이 되고 배열의 다음 요소는 독립적인 인수로 무시됩니다. 해결책은 파싱할 때 두 가지 경우를 모두 고려하는 것입니다:
if ($arg =~ /^--(\w+)=?(.*)/)
$val이 비어 있으면 다음 요소를 가져옵니다.
Perl은 공백을 포함한 인수에 대해 어떻게 작동하나요?
Perl은 @ARGV 내부의 인수를 공백으로 분리하지 않으며 모든 분리는 쉘에 의해 이루어집니다. 따라서 "--foo=bar baz"는 명령줄에서 인용부호 없이 전달되면 두 개의 다른 요소로 처리됩니다. 이는 고려해야 하며 항상 사용자가 공백을 이스케이프하도록 요구해야 합니다.
shift를 사용하여 @ARGV를 수정할 수 있지만 원래 인수를 잃지 않으려면 어떻게 하나요?
Shift는 배열 자체를 변경하므로 원래 인수 목록을 복원할 수 없습니다. @ARGV의 원래 내용을 저장해야 하는 경우 미리 복사해야 합니다:
my @original_argv = @ARGV;
스크립트가 '--foo=bar' 형식의 키만 처리하고 '--foo bar'는 무시하여 값이 없을 경우 오류가 발생했습니다.
장점:
단점:
두 가지 구문 및 @ARGV의 길이 확인을 추가하고 플래그 스위치를 허용했습니다.
장점:
단점: