다음 명령은 예상대로 작동합니다.
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 '...'
"문자열을 l
Perl 코드로 평가하고 이를 '...'
코드가 읽을 파일의 이름으로 사용하십시오"라고 말하는 것은 별로 의미가 없습니다(그래서 "해당 파일이 없거나"라는 이상한 메시지가 표시되는 것입니다). 디렉터리" 오류).
따라서 아니요, 옵션의 순서는 중요하지 않습니다(여기서). 그러나 옵션을 이동하는 경우 -e
옵션 인수와 Perl 코드를 이동해야 Perl 코드가 항상 옵션 바로 뒤에 오도록 해야 합니다.
-e
예를 들어 해당 옵션을 먼저 넣으 려면 다음을 사용하세요.
perl -e '...' -ln
동일한 명령줄에서 및 등의 옵션을 혼합하는 경우 옵션의 순서가 perl
매우 중요합니다. 하나의 옵션은 다음 옵션에 의해 무시되고 그 반대의 경우도 마찬가지이므로 와 동일합니다. 이는 설명서에 설명되어 있습니다( 또는 참조).-p
-n
-p
-n
perl -np
perl -p
perl -pn
perl -n
perlrun
man perlrun
perldoc 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