3

フォーマットされた SQL のブロックを追加したい文字列があります。ヒアドキュメントを使用して追加する方法はありますか? または、ヒア ドキュメントを使用して新しい文字列を作成し、それを既存の文字列に追加する必要がありますか?

4

3 に答える 3

5

あなたはおそらく言うことができます

    $str = <<EOH;
$str
more stuff here
EOH

しかし、Perl はそれを次のように最適化します。

    $str .= <<EOH;
more stuff here
EOH

次のように別の変数を設定する必要はありません。

    $str1 = <<EOH;
more stuff here
EOH
    $str .= $str1;

; 古い Perl でも、前の 2 つは問題なく動作するはずです (一方、非常に古い Perl 5 では、動作しないケースがいくつかありました。特にprint <<EOH;、ヒア ドキュメントの内容が失われていました)。

于 2011-03-29T20:08:33.937 に答える
2

ここでのドキュメントは非常に柔軟性があり、通常の文字列リテラルを使用するほとんどの状況で使用できます。これらは、関数呼び出しまたは複合式の一部として使用できます。

my $inner_str = 'middle text';

my $full_str = <<FIRST_BLOCK . "$inner_str\n" . <<SECOND_BLOCK;
This text is at the start of the string.
And so is this.
FIRST_BLOCK
This text ends the first assignment to the string.
SECOND_BLOCK

Perlがヒアドキュメントを解析するために使用するルールは、いくつかの非常に奇妙な動作を可能にします。ヒアドキュメントが見つかると、現在の行はその行が終了するまで解析され続けます。次に、perlは現在の式の解析を停止し、終了トークンが見つかるまでヒアドキュメントの読み取りを開始します。その行で開始されたすべてのヒアドキュメントの終了トークンが見つかると、式に中断がなかったかのように解析が再開されます。

$full_str .= <<THIRD_BLOCK . "$inner_str
This text is "appended" to the string.
THIRD_BLOCK
" . <<LAST_BLOCK;
This text ends the string.
LAST_BLOCK

print $full_str;

文字列は、ヒアドキュメントTHIRD_BLOCKの本体の前で始まり、ヒアドキュメントTHIRD_BLOCKの後で終わりますが、その内容は含まれていないことに注意してください。

ヒアドキュメントの構文は非常に柔軟ですが、式ごとに1つのヒアドキュメントのみを使用することをお勧めします。式は単純にしてください。1つの式に複数のヒアドキュメントが必要な場合、または複雑な式に1つ必要な場合は、最初にヒアドキュメントを変数に割り当て、その変数を式で使用します。

于 2011-03-30T16:05:03.177 に答える
1

はい、できます。

$sql = "select something";
print <<END
Line 1
Line 2
Line 3
END
. $sql;

出力:

Line 1
Line 2
Line 3
select something
于 2011-03-29T20:07:09.710 に答える