だから私はperlが非常に変わった構文を持っていることを理解しているが、先日仕事でコードスニペットに出くわし、混乱した。誰かがそれが何を意味するのか私に説明してもらえますか?
<<'m'=~m>>
print $a unless $b;
return;
m
;
HEREDOC構文のように見えますが、これまでに見た形式ではありません。
だから私はperlが非常に変わった構文を持っていることを理解しているが、先日仕事でコードスニペットに出くわし、混乱した。誰かがそれが何を意味するのか私に説明してもらえますか?
<<'m'=~m>>
print $a unless $b;
return;
m
;
HEREDOC構文のように見えますが、これまでに見た形式ではありません。
回答:
この秘密の構文は、華やかな二重刃の剣として知られており、通常は次のように表されます。
<<m=~m>>
Comments here
m
;
これは、ヒアドキュメント構文と一致演算子(=~
)を>
区切り文字として使用する、複数行コメントのハックです。
スラッシュ、、/
はマッチングの区切り文字として使用されていないため、「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コンテキストでの標準的なヒアドキュメント構文です。
voidコンテキストに文字列があると問題が発生する可能性があるため、これを本番コードで使用することはお勧めしません。さらに、このコードは、最も経験豊富なPerlプログラマーにとっても頭を悩ませるものであり、読み、保守するのが無意味に困難です。適切な複数行コメントを作成したい場合は、ここで説明されているようにポッドに固執することをお勧めします。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"