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文档中阅读,我认为=~运算符返回一个boolean值,即trueor false

我的问题是:上述$myVariable涉及的操作是否会影响其价值。

注意$myVariable' 值在我的脚本中设置为 a 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 可以是任何左值。

leftvalue =~ rightwalue表达式始终计算为布尔值,但该值未分配给 leftvalue !这个布尔值就是表达式本身的值!所以你可以在 if 子句中很好地使用它:

if (leftvalue =~ rightvalue) {
    // do something
}
  • m/regexp/永远不会改变任何事情。它只是测试,如果正则表达式匹配左值。
  • s/regexp/replacement/还测试 regexp 是否与 leftvalue 匹配,如果匹配,则将匹配部分替换为replacement. 如果正则表达式匹配,leftvalue =~ rightvalue则为真,否则为假。
  • 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 语句为真,并且“匹配!” 附在字符串上。

a[1] = 'aubu123'

正则表达式不匹配。没有任何东西被替换,并且 if 语句是错误的。

于 2012-04-09T11:55:51.060 回答
2

绑定运算符只是将目标变量“绑定”到其中一个运算符。它不影响价值。替换运算符 ,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 回答