Perl - 닫는 중괄호가 여는 중괄호 앞에 옵니다. 어떻게 작동하나요?

Perl - 닫는 중괄호가 여는 중괄호 앞에 옵니다. 어떻게 작동하나요?

내가 우연히 만났어이 솔루션파일 내용을 반대로 바꿉니다.

$ 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순서대로 줄을 추가하고 루프 뒤의 명령은 이를 역순으로 인쇄합니다.

관련 정보