프로그래밍백엔드 개발자

Perl에서 모듈 없이 명령줄 인수를 처리하는 방법과 복잡한 매개변수를 파싱할 때 고려해야 할 미세한 사항은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

명령줄 인수 처리 - 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};

주요 특징:

  • 위치 및 명명된 매개변수에 유연하게 작업.
  • 값의 존재 및 길이를 수동으로 확인.
  • 자유 인수 목록(_free)을 별도로 유지.

속임수 질문.

인수가 '--flag value' 형식으로 전달되면 어떻게 되나요?

'='를 기준으로 분리할 경우 값은 빈 문자열이 되고 배열의 다음 요소는 독립적인 인수로 무시됩니다. 해결책은 파싱할 때 두 가지 경우를 모두 고려하는 것입니다:

if ($arg =~ /^--(\w+)=?(.*)/)

$val이 비어 있으면 다음 요소를 가져옵니다.

Perl은 공백을 포함한 인수에 대해 어떻게 작동하나요?

Perl은 @ARGV 내부의 인수를 공백으로 분리하지 않으며 모든 분리는 쉘에 의해 이루어집니다. 따라서 "--foo=bar baz"는 명령줄에서 인용부호 없이 전달되면 두 개의 다른 요소로 처리됩니다. 이는 고려해야 하며 항상 사용자가 공백을 이스케이프하도록 요구해야 합니다.

shift를 사용하여 @ARGV를 수정할 수 있지만 원래 인수를 잃지 않으려면 어떻게 하나요?

Shift는 배열 자체를 변경하므로 원래 인수 목록을 복원할 수 없습니다. @ARGV의 원래 내용을 저장해야 하는 경우 미리 복사해야 합니다:

my @original_argv = @ARGV;

일반적인 오류 및 안티 패턴

  • 키 뒤에 값이 있는지 확인하지 않아 배열을 잘못 읽음.
  • 값이 없는 자유 인수 및 플래그 처리를 무시함.
  • '--key value' 및 '--key=value' 두 가지 경우를 고려하지 않음.

실제 사례

부정적 사례

스크립트가 '--foo=bar' 형식의 키만 처리하고 '--foo bar'는 무시하여 값이 없을 경우 오류가 발생했습니다.

장점:

  • 코드는 간단합니다.

단점:

  • 스크립트 사용이 불편하여 사용자가 자주 실수했습니다.
  • 스크립트가 예상치 못한 명령줄 시나리오에서 중단되었습니다.

긍정적 사례

두 가지 구문 및 @ARGV의 길이 확인을 추가하고 플래그 스위치를 허용했습니다.

장점:

  • 스크립트가 예상치 못한 인수로 중단되지 않게 되었습니다.
  • 사용자가 명령줄 작업을 더 자신 있게 수행하게 되었습니다.

단점:

  • 최소 버전과 비교하여 코드가 조금 더 많습니다.