複雑な MySQL クエリを perl で書き留める必要があります。複数行で構成したい。
残念ながら、EOF 表記を使用すると、perl は文字列に \n を挿入します。Perl が \n を挿入しないように、文字列を複数の行に書き留める方法はありますか? 各行を + で明示的に連結したくありません。
いいえ。ただし、事後的に線を簡単に削除できます。たとえば、次のようになります。
(my $query = <<'EOF') =~ s/\n */ /g;
SELECT col1,
MIN(col2)
FROM t
WHERE col3 > 17
GROUP
BY col1
EOF
print "$query\n";
これを印刷します:
SELECT col1, MIN(col2) FROM table t WHERE col3 > 17 GROUP BY col1
追加するために編集:
上記について注意すべき点がいくつかあります。
my
-expression を括弧で囲んでも構いません。変数は、囲んでいるブロックにスコープが設定されたままです。-expressionmy
は、それが宣言する変数に評価され、その変数を引き続き変更できます。例えば:
(my $three) = 3; # same as: my $three = 3;
(my $four = 2) += 2; # same as: my $four = 4;
(my $five = 'twenty-five') =~ s/.*-//; # same as: my $five = 'five';
ヒアドキュメント表記は、次<<
の行でヒアドキュメント (複数行の文字列) を開始します。例えば:
my $abc = <<'EOF' . 'xyz'; # same as: my $abc = "abc\nxyz";
abc
EOF
実際、これは非常に一般的です。が行の最後に<<EOF
あるのは少し珍しいことです。それ以外の場合は、通常、文の終わりを示すセミコロンがその後にあるからです。
同じ行に複数のヒアドキュメントがある場合、各ヒアドキュメントは前のヒアドキュメントが終了した後の行から始まります。
my $abc = <<'EOF1' . <<'EOF2'; # same as: my $abc = "abc\nxyz\n";
abc
EOF1
xyz
EOF2