명령줄 인수 처리는 내장 배열 @ARGV를 통해 이루어지며, 이 배열에는 스크립트를 실행할 때 전달된 모든 매개변수가 포함됩니다(스크립트 이름 제외). 이는 모든 CLI Perl 애플리케이션을 위한 기본적인 방법이지만, 데이터 유형, 인코딩, 매개변수 분할 및 파일 자동 읽기와 관련된 많은 세부 사항이 있습니다.
Perl의 초기 버전부터 배열 @ARGV는 argv[]와 유사한 실행 인수에 대한 표준 "진입점"을 제공했습니다. 그러나 Perl은 범용 프로그래밍 및 텍스트 작업을 위한 언어로 많은 추가 트릭을 추가했습니다. 예를 들어 <> 표현식은 @ARGV의 내용과 "연결되어" 있어 인수로 나열된 파일을 즉시 읽을 수 있게 합니다.
단순히 @ARGV를 읽는 것은 간단한 경우에만 적합합니다. 복잡한 CLI 프로그램에서는 옵션 처리(예: --help, -o file)가 필요해지며, 이 경우 단순한 인덱스를 통한 데이터 읽기는 안전하지 않고 불편합니다. 인수에 공백, 비표준 문자 또는 다양한 인코딩이 포함된 경우에는 더욱 복잡해집니다. 또한, <> 연산자를 통해 파일을 자동으로 여는 문제와, 예를 들어 @ARGV 요소가 "-"(stdin)와 같은 경우 예기치 않은 동작이 발생할 수 있습니다.
단순 인수 읽기:
foreach my $arg (@ARGV) { print "Arg: $arg "; }
보통 옵션에는 특별한 모듈 Getopt::Long을 사용합니다:
use Getopt::Long; my $help; GetOptions('help' => \$help);
@ARGV의 모든 파일 내용을 읽기 위해서는 다음과 같은 루프를 사용할 수 있습니다:
while (<>) { print; }
만약 명령줄 인수 중 하나가 단순히 하이픈 (-)이면 어떻게 되나요?
이 경우, 연산자 <>를 사용할 때 Perl은 '-'를 파일 이름이 아닌 표준 입력(stdin)으로 인식합니다.
perl script.pl - file.txt # stdin에서 먼저 읽고 그 다음 file.txt에서 읽습니다
스크립트 내에서 @ARGV를 안전하게 수정할 수 있나요?
네, 이는 이미 처리된 인수를 제거하기 위한 표준 관행입니다. 일반적으로 옵션 처리가 끝난 후 @ARGV에는 "맑은" 파일 이름이나 인식되지 않은 매개변수만 남깁니다.
@ARGV에서 UTF-8 인수를 처리할 때 encode/decode를 해야 하나요?
이는 로케일 및 환경에 따라 다릅니다. 기본적으로 Perl은 @ARGV의 인코딩을 변환하지 않고 "있는 그대로" 받아들입니다. 따라서 파일 이름(또는 매개변수)에 비ASCII 문자가 포함된 경우, Perl에서 작업하기 위해 명시적으로 Encode를 사용하여 문자열을 디코딩하는 것이 좋습니다.
로그를 파싱하는 유틸리티가 파일 목록을 받습니다. 사용자가 실수로 '-':
perl parse.pl - access.log
결과적으로 프로그램이 갑자기 멈추고 키보드 입력을 기다립니다.
장점:
단점:
CLI 프로그램이 Getopt::Long을 통해 인수를 읽고, 모든 하이픈 옵션을 명확히 처리하여 @ARGV에 파일 이름만 남깁니다:
perl report.pl --input access.log --output report.txt
장점:
단점: