为什么我不能在字符串中替换所有字符串而是取回空字符串?

时间:2013-10-03 06:26:00

标签: regex string perl replace

我试图用新线替换所有出现回车,新线但是我不能。 尝试:my $new_string = $old_string =~ s/\r\n/\n/g
给出一个空的$new_sting 这个:my $new_string = $old_string =~ s/\r\n$/\n/g也无法使用空字符串 我在这里搞砸了什么?

3 个答案:

答案 0 :(得分:5)

原始尝试的问题是$old_string与替换运算符绑定(因此它是将被修改的变量),然后替换运算符的返回值变为匹配成功的次数。该匹配计数位于$new_string如果匹配失败,则使用空字符串表示零计数。

您的原始尝试在更新版本的Perl中可以正常工作,只需稍加修改即可支持/r修饰符:

my $new_string = $old_string =~ s/\r\n/\n/gr;

该修饰符触发替换运算符的“非破坏性”模式,并返回修改后的字符串而不是计数。 /r修饰符是在Perl 5.14中引入的,在perlop中有描述。

在旧版本的Perl中,括号可用于操纵优先级:

( my $new_string = $old_string ) =~ s/\r\n/\n/g

此语法首先评估my $new_string = $old_string,然后使用$new_string与替换绑定。

答案 1 :(得分:4)

my $new_string = $old_string =~ s/\r\n/\n/g

返回替换的数字,而不是新字符串。要查看新字符串,请在替换后使用print $old_string


来自perlop

s/PATTERN/REPLACEMENT/msixpodualgcer

在字符串中搜索模式,如果找到,则用替换文本替换该模式,返回替换次数否则返回false(特别是空字符串)。如果使用/ r(非破坏性)选项,则它在字符串副本上运行替换,而不是返回替换次数,无论是否发生替换,它都会返回副本。使用/ r时,原始字符串永远不会更改。即使输入是对象或绑定变量,副本也始终是纯字符串。

答案 2 :(得分:2)

您替换$old_string$new_string仅包含已完成的替换次数,因此请使用括号更改操作的优先级,

(my $new_string = $old_string) =~ s/\r\n/\n/g;