2

以下は、Perl が実行できる多くの優れた機能の 1 つです。

my ($tmp) = ($_=~ /^>(.*)/);

ループ内の現在の行でパターン ^>.* を見つけ、括弧内にあるものを $tmp 変数に格納します。

私が興味を持っているのは、この構文の背後にある概念です。どのように、そしてなぜ(どのような前提の下で)これが機能するのですか?私の理解では、スニペット $_=~ /^>(.*)/ はブール値のコンテキストですが、括弧はそれをリスト コンテキストとしてレンダリングしますか? しかし、なぜ一致したパターンの括弧内のものだけが変数に格納されるのでしょうか?!

「記憶」しなければならない変数割り当ての特殊なケースですか、それとも完全に説明できますか? もしそうなら、この機能は何と呼ばれていますか(「autovivifacation」のような名前)

4

3 に答える 3

5

リスト代入とスカラー代入の 2 つの代入演算子があります。選択は、「 」の LHS に基づいて決定され=ます。(2 つの演算子については、ここで詳しく説明します。)


この場合、リスト代入演算子が使用されます。リスト代入演算子は、両方のオペランドをリスト コンテキストで評価します。

では$_=~ /^>(.*)/、リスト コンテキストで は何をするのでしょうか? パーロップを引用:

/gオプションが使用されていない場合、m//リスト コンテキストでは、パターン内の括弧に一致する部分式 ( $1$2$3...) で構成されるリストを返します [...] パターン内に括弧がない場合、戻り値値は(1)成功のリストです。括弧の有無にかかわらず、失敗すると空のリストが返されます。

言い換えると、

my ($match) = $_ =~ /^>(.*)/;

と同等です

my $match;
if ($_ =~ /^>(.*)/) {
    $match = $1;
} else {
    $match = undef;
}

括弧が省略された場合 ( my $tmp = ...;)、代わりにスカラー代入が使用されます。スカラー代入演算子は、両方のオペランドをスカラー コンテキストで評価します。

$_=~ /^>(.*)/では、スカラー コンテキストで何を行うのでしょうか。パーロップを引用:

成功した場合は true、失敗した場合は false を返します。

言い換えると、

my $matched = $_ =~ /^>(.*)/;

と同等です

my $matched;
if ($_ =~ /^>(.*)/) {
    $matched = 1;   # !!1 if you want to be picky.
} else {
    $matched = 0;   # !!0 if you want to be picky.
}
于 2012-04-26T21:06:54.300 に答える
2

検索パターンの角かっこは、それを「グループ」にします。返されるのは$_ =~ /regex/、一致するすべてのグループの配列であるためmy ($tmp)、最初のグループを$tmpに取り込みます。

于 2012-04-26T21:03:31.870 に答える
1

perl のすべての操作には、代入を含む戻り値があります。そのため、 の結果を実行$a=$b=1して設定できます。$a$b=1

=~ブール (まあ、スカラー) コンテキストで使用できますが、それは、一致がない場合に空のリスト / undef を返し、それが false と評価されるためです。配列コンテキストで呼び出すと、他のコンテキスト依存関数が wantarray メソッドを使用してコンテキストを判別できるように、配列が返されます。

于 2012-04-26T21:08:14.933 に答える