如何在Perl中表现出来?

时间:2012-04-09 11:15:30

标签: regex perl

我有以下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值,即truefalse

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

N.B。 $myVariable的值在我的脚本中设置为string,这是$_变量split的结果。我认为这不应该影响该操作的行为。

P.S。如果您需要我脚本中的更多代码,请立即让我。

4 个答案:

答案 0 :(得分:3)

$myVariable已更改,但因为您正在进行替换(s///),而不是因为匹配或替换的结果是布尔值; =~=不同,就像==。如果你想要动作的布尔结果,你需要分配它。

$result = $myVariable =~ s/\+/ /g;

答案 1 :(得分:2)

我们正在谈论

leftvalue =~ rightvalue

rightvalue必须是以下之一:

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

leftvalue可以是任何左值。

expresion leftvalue =~ rightwalue总是求值为布尔值,但是这个值没有赋值给leftvalue!这个布尔值是表达式本身的值!所以你可以在if子句中使用它非常好:

if (leftvalue =~ rightvalue) {
    // do something
}
  • m/regexp/永远不会改变任何事情。它只是测试,如果regexp匹配左值。
  • s/regexp/replacement/还会测试regexp是否与leftvalue匹配,如果匹配,则会将匹配的部分替换为replacement。如果regexp匹配,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语句也是假的。

答案 2 :(得分:2)

绑定运算符只是将目标变量“绑定”到其中一个运算符。它不会影响价值。替换运算符s///通常会更改目标值并返回它所做的替换次数。

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

从Perl v5.14开始,替换运算符有一个/r标志,单独留下目标值,而不是返回计数,返回修改后的值:

 my $modified = $target =~ s/.../.../r;

答案 3 :(得分:1)

=〜本身并不是什么意思,它还需要对它左边的变量做一些事情。

要查看变量是否匹配模式,您在右侧使用m //,您可能希望将其用作布尔值,但您也可以在其他方面使用它。这不会改变$ foo:

$foo =~ m/pattern/

替换替换模式,请使用右侧的s ///,这会改变$ foo:

$foo =~ s/pattern/replacement/;

要在$ foo中翻译单个字符,请在右侧使用tr ///,这会改变$ foo:

$foo =~ tr/abc/def/;