3

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

4

3 回答 3

5

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

您最初的尝试将在支持/r修饰符的更新版本的 Perl 中正常工作,只需稍作修改:

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绑定替换。

于 2013-10-03T06:32:17.027 回答
4

这个

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

返回替换的数量,而不是新的字符串。要查看新字符串,就print $old_string在替换之后。


perlop

s/PATTERN/REPLACEMENT/msixpodualgcer

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

于 2013-10-03T06:30:53.920 回答
2

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

(my $new_string = $old_string) =~ s/\r\n/\n/g;
于 2013-10-03T06:27:42.903 回答