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