我有以下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
值,即true
或false
。
我的问题是:涉及$myVariable
的上述操作是否影响其价值。
N.B。 $myVariable
的值在我的脚本中设置为string
,这是$_
变量split
的结果。我认为这不应该影响该操作的行为。
P.S。如果您需要我脚本中的更多代码,请立即让我。
答案 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/;