그래서 저는 펄이 비정상적인 구문을 가지고 있다는 것을 이해합니다.하지만 다른 날에 저를 혼란스럽게 만드는 코드 조각을 발견했습니다. 누군가 그것이 의미하는 바를 설명해 주시겠습니까?
<<'m'=~m>>
print $a unless $b;
return;
m
;
HEREDOC 구문처럼 보이지만 내가 본 어떤 형태도 아닙니다.
답변
이 비밀 구문은 화려한 양날 검 으로 알려져 있으며 일반적으로 다음과 같이 표시됩니다.
<<m=~m>>
Comments here
m
;
heredoc 구문과 일치 연산자 ( =~
)를 >
구분 기호로 사용하는 여러 줄 주석에 대한 해킹입니다 .
슬래시, /
는 일치를위한 구분자로 사용되지 않으므로 ‘m’연산자가 필요합니다. 예를 들어 $my_var =~ /test/
는와 동일 $my_var =~ m>test>
하지만 $my_var =~ >test>
유효하지 않습니다.
m
스 니펫 의 첫 번째 문자가 작은 따옴표로 묶여 있다는 사실에주의 하십시오. 즉, $a
및 $b
변수가 보간되지 않습니다. 이 따옴표가 생략되면 (제공된 코드 예제에 따라) perl은 자동으로 끝 마커에 큰 따옴표를 추가하고 모든 후속 변수는 보간됩니다. 경우 문제가 발생할 것 $a
하고는 $b
더 이상 정의되지 않으며 사용중인 use warnings;
.
위의 화려한 이중 블레이드 예제를 이해하기 쉽게 만들기 위해 (권장하지 않음) 다음과 같이 작성할 수 있습니다.
<<"END" =~ //
Comments here
END
;
참고이는 것을 =~ //
이에 해당하므로, 중복 :
<<"END";
Comments here
END
이것은 void 컨텍스트에서 표준 heredoc 구문입니다.
빈 컨텍스트에 문자열이 있으면 문제가 발생할 수 있으므로 프로덕션 코드에서 이것을 사용하지 않는 것이 좋습니다. 게다가이 코드는 경험이 많은 펄 프로그래머에게도 머리를 긁는 도구이며 읽고 유지하기가 무의미합니다! 적절한 여러 줄 주석을 작성하려면 여기에 설명 된대로 pod를 고수하는 것이 좋습니다 . Perl에서 여러 줄 주석을 입력 하려면 어떻게해야합니까?
이것이 해결되기를 바랍니다.
답변
B :: Deparse를 실행 하면 perl이 해당 코드를 어떻게 처리하는지 이해하는 데 많은 도움이됩니다 ( “test.pl”파일에 있다고 가정).
perl -MO=Deparse test.pl
우리에게 보여줘:
"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK
따라서 보시다시피 perl은 빈 regexpr을 다음 문자열과 일치 시키려고합니다. "print \$a unless \$b;\nreturn;\n"