1. ホーム
  2. perl

[解決済み] perlの<<'m'=~m>>構文は何を意味するのでしょうか?

2023-08-03 18:09:24

質問

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 コンテキストでの標準的な heredoc 構文に過ぎません。

voidコンテキストで文字列を持つことは問題を引き起こす可能性があるため、実運用コードでこれを使用することはお勧めしません。さらに、このコードは最も経験豊富なPerlプログラマでさえも頭を悩ませるものであり、読むのもメンテナンスするのも無意味に難しいのです! もし適切な複数行のコメントを作成したいのであれば、ここで説明されているようにPodに固執することをお勧めします。 Perl で複数行のコメントを入力するにはどうしたらいいですか?

これですっきりするといいのですが。