입력 파일이 stdin인 경우에도 Perl에 항상 "-p" 옵션이 필요한 이유는 무엇입니까?

입력 파일이 stdin인 경우에도 Perl에 항상 "-p" 옵션이 필요한 이유는 무엇입니까?

업데이트 #2: 옵션에 대해 큰 오해가 있었습니다 -p. 이제 이 옵션이 인수로 제공된 모든 파일을 처리하는 데 사용된다는 것이 분명해졌지만 stdin.


업데이트 #1: 기본 구분 기호(개행 문자)를 사용하고 입력 파일이 한 줄인 경우에도 이 옵션이 항상 필요하다는 것을 알았습니다 -p(적어도 대체를 수행할 때). 왜 삭제하는지 잘 모르겠습니다. -p단일 라인을 처리하는 옵션(적절한 것으로 보임)은 모든 것을 중단시킵니다(즉, 출력 없음).

예를 들어 예상대로 echo -n 'test' | perl -pe 's/test/newstring/'출력을 실행 newstring하지만 echo -n 'test' | perl -e 's/test/newstring/'아무것도 출력하지 않습니다.


원래 질문:

stdinPerl 명령(예: ) 에서 읽는 전체 파일을 후루룩 소리 내는 경우 실제로 파일(예: )을 처리하기 위해 perl -0777 -e [...]여전히 옵션이 제공되어야 하는 이유는 무엇입니까 ?-pperl -0777 -pe [...]

-p옵션이 명령의 각 줄 주위에 루프를 배치한다는 것을 이해 하지만 Perl이 파일을 처리할 수 있을 만큼 구분 기호를 변경(이 경우 제거)하지 않는 이유는 무엇입니까? 또는 파일이 한 번만 처리된다는 사실에도 불구하고 명령의 각 행 주위에 루프를 배치하도록 Perl에 지시하는 것이 왜 필요한가요?

답변1

명령 perl --help에는 -p assumes a loop like -n but prints line also, like sed. sed스트림 편집기이며 -p옵션이 에서 작동하는 방식과 유사하게 텍스트를 조작하는 데 사용됩니다 perl. 처리된 출력을 인쇄하기 -p위한 유일한 옵션입니다 . 옵션이 perl없으면 -p처리된 출력물을 인쇄할 수 없습니다. 따라서 아래 예에서 볼 수 있듯이 인쇄가 발생하지 않으면 문자열이 대체되지 않습니다.

-p경고: 파일 을 -n비워 버리므로 를 로 바꾸지 마십시오 !

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nosplash"

~$ sudo perl -pi -e 's/nosplash/splash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

~$ sudo perl -i -e 's/splash/nosplash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

관련 정보