1

私は次のperlスクリプトを持っています:

$myVariable = "some value";
//... some code ...
$myVariable =~ s/\+/ /g;
$myVariable =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
//.. some more code ...

ドキュメントを読むと、演算子は値、つまりまたはを返すperlと思います。=~booleantruefalse

私の質問は次のとおり$myVariableです。関与する上記の操作は、その値に影響を与えるかどうか。

注意:$myVariableの値は、私のスクリプトでは、変数ののstring結果であるに設定されています。それがその操作の動作に影響を与えるべきではないと思います。$_split

PS私のスクリプトからさらにコードが必要な場合は、今すぐさせてください。

4

4 に答える 4

3

$myVariableは変更されますが、置換(s///)を実行しているためであり、一致または置換の結果がブール値であるためではありません。=~のようではなく=、のよう==です。アクションのブール結果が必要な場合は、それを割り当てる必要があります。

$result = $myVariable =~ s/\+/ /g;
于 2012-04-09T11:19:33.547 に答える
2

私たちは〜について話している

leftvalue =~ rightvalue

rightvalueは、次のいずれかである必要があります。

m/regexp/
s/regexp/replacement/
tr/regexp/translation/

leftvalueは、左の値であれば何でもかまいません。

expresionleftvalue =~ rightwalueは常にブール値に評価されますが、この値はleftvalueに割り当てられません!このブール値は、式自体の値です。したがって、if句で非常にうまく使用できます。

if (leftvalue =~ rightvalue) {
    // do something
}
  • m/regexp/何も変更されません。正規表現がleftvalueと一致するかどうかをテストするだけです。
  • s/regexp/replacement/また、正規表現がleftvalueと一致するかどうかをテストし、一致する場合は、一致する部分を。に置き換えreplacementます。正規表現が一致した場合leftvalue =~ rightvalueはtrue、それ以外の場合はfalseです。
  • tr/regexp/replacement/同様に、と同じs///ですが、置換の代わりに翻訳があります。

したがって、これは正常に機能します。

my @a=('acbc123','aubu123');
foreach (@a) {
    if ($_ =~ s/c(\d)/x$1/g;) {
        $_ .= 'MATCHED!';
    }
}

結果は次のようになります。

a[0] = 'acbx123MATCHED!'

'c'の後に数字が続くのは、正規表現と一致しました。したがって、istは「x」とその数字に置き換えられました。そして、それが一致したので、ifステートメントはtrueであり、「MATCHED!」文字列に添付されています。

a[1] = 'aubu123'

正規表現が一致しませんでした。何も置き換えられず、ifステートメントはfalseでした。

于 2012-04-09T11:55:51.060 に答える
2

バインディング オペレータは、ターゲット変数をオペレータの 1 つに「バインド」するだけです。値には影響しません。置換演算子 はs///、通常、ターゲット値を変更し、それが行った置換の数を返します。

 my $count = $target =~ s/.../.../;
 my $count = ( $target =~ s/.../.../ );  # same thing, clarified with ()

Perl v5.14 から/r、ターゲット値をそのままにして、カウントを返す代わりに、変更された値を返す置換演算子のフラグがあります:

 my $modified = $target =~ s/.../.../r;
于 2012-04-09T23:54:19.630 に答える
1

=~ はそれ自体では何の意味もありません。左側の変数に対して行うには、右側にも何かが必要です。

変数がパターンに一致するかどうかを確認するには、右側で m// を使用します。おそらくこれをブール値として使用したいと思うでしょうが、他の意味でも使用できます。これは $foo を変更しません:

$foo =~ m/pattern/

パターンを置換するには、右側で s/// を使用します。これにより、$foo が変更されます。

$foo =~ s/pattern/replacement/;

$foo 内の単一の文字を変換するには、右側で tr/// を使用します。これにより $foo が変更されます。

$foo =~ tr/abc/def/;
于 2012-04-09T11:23:48.737 に答える