Perl에서 명령줄 옵션의 순서가 중요합니까?

Perl에서 명령줄 옵션의 순서가 중요합니까?

다음 명령은 예상대로 작동합니다.

perl -lne 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt

이것도 작동합니다:

perl -nle 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt

그러나 다음과 같은 오류가 나타납니다.

perl -nel 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt

오류 메시지는 다음과 같습니다.

/install(TARGETS (.*) RUNTIME DESTINATION bin)/: 해당 파일이나 디렉터리가 없는 경우 $1 인쇄를 열 수 없습니다.

그 이유는 무엇입니까?

답변1

-e옵션은 Perl 코드로 평가될 문자열인 하나의 인수를 사용합니다. 옵션의 순서는 중요하지 않기 때문에(이 경우) 를 perl -lne '...'사용 하면 예상대로 작동합니다.perl -nle '...'

그러나 를 사용할 때 perl -nel '...'"문자열을 lPerl 코드로 평가하고 이를 '...'코드가 읽을 파일의 이름으로 사용하십시오"라고 말하는 것은 별로 의미가 없습니다(그래서 "해당 파일이 없거나"라는 이상한 메시지가 표시되는 것입니다). 디렉터리" 오류).

따라서 아니요, 옵션의 순서는 중요하지 않습니다(여기서). 그러나 옵션을 이동하는 경우 -e옵션 인수와 Perl 코드를 이동해야 Perl 코드가 항상 옵션 바로 뒤에 오도록 해야 합니다.

-e예를 들어 해당 옵션을 먼저 넣으 려면 다음을 사용하세요.

perl -e '...' -ln

동일한 명령줄에서 및 등의 옵션을 혼합하는 경우 옵션의 순서가 perl매우 중요합니다. 하나의 옵션은 다음 옵션에 의해 무시되고 그 반대의 경우도 마찬가지이므로 와 동일합니다. 이는 설명서에 설명되어 있습니다( 또는 참조).-p-n-p-nperl -npperl -pperl -pnperl -nperlrunman perlrunperldoc perlrun

답변2

~에서perlrun도움말 페이지:

perl ... [ [-e|-E] 'command' ] ...

Perl은 옵션 뒤에 오는 모든 것을 -e명령으로 처리합니다. 그 중에는 -nel명령 l이 있습니다 -e. print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/옵션이 아닌 첫 번째 인수는 Perl이 열려고 시도했지만 실패하는 입력 파일이 됩니다.

비교하고 이렇게 말해보세요.

~ echo  foo | perl -neprint
foo

관련 정보