[perl] Perl에서 << ‘m’= ~ m >> 구문은 무엇을 의미합니까?

그래서 저는 펄이 비정상적인 구문을 가지고 있다는 것을 이해합니다.하지만 다른 날에 저를 혼란스럽게 만드는 코드 조각을 발견했습니다. 누군가 그것이 의미하는 바를 설명해 주시겠습니까?

<<'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"


답변