내가 우연히 만났어이 솔루션파일 내용을 반대로 바꿉니다.
$ cat f1
abc
def
ghi
jkl
$ perl -ne 'push @arr,$_;}{print reverse @arr;' f1
jkl
ghi
def
abc
교정기가 어떻게 작동하는지 설명해 줄 수 있는 사람이 있나요? 혼란스럽네요. 오른쪽 대괄호가 왼쪽 대괄호 앞에 옵니다.
답변1
-n
이는 스위치가 실제로 소스 코드 주위에 중괄호를 추가하기 때문입니다 . ~처럼수동설명하다:
-n
Perl은 프로그램 주위에 다음과 같은 루프가 있다고 가정하여sed -n
또는 같은 파일 이름 인수를 반복하게 합니다awk
.LINE: while (<>) { ... # your program goes here }
이는 단지 Perl이 프로그램 주위에 동일한 루프를 실행한다는 의미는 아닙니다. 실제로 여기에 표시된 접두사와 접미사를 추가합니다(간격은 다름). 소스 코드 인용 ( toke.c
):
if (PL_minus_n || PL_minus_p) {
sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
그리고
} else if (!PL_in_eval && PL_minus_n) {
sv_catpvs(linestr, /*{*/";}");
이 함수는 sv_catpvs
구문 분석할 소스 코드가 포함된 중간 버퍼에 지정된 문자열을 추가합니다. 나는 개행 문자가 이전에도 삽입되었다고 생각합니다 ;}
( 문자열에서 주석 처리되지 않았기 때문에) #
. -e
이 두 호출 사이 어딘가에 -e
뭔가가 추가됩니다.
-p
, 등 의 다른 스위치도 -F
비슷하게 -E
작동합니다.
따라서 코드 예제가 실행됩니다.
LINE: while (<>) {push @arr,$_;}{print reverse @arr;;}
적절한 간격이 있으면 그렇습니다.
LINE: while (<>) {
push @arr,$_;
}
{
print reverse @arr;
;
}
사용하지 않는 태그, 두 번째 중괄호 세트(그룹화에 필요하지 않음) 및 빈 지시문(lone ;
)을 제거합니다. 즉, 다음과 같습니다.
while (<>) {
push @arr,$_;
}
print reverse @arr;
루프는 @arr
순서대로 줄을 추가하고 루프 뒤의 명령은 이를 역순으로 인쇄합니다.