我正在尝试用新行替换所有出现的回车,新行,但我不能。
Trying:my $new_string = $old_string =~ s/\r\n/\n/g
给出一个空的$new_sting
.
这:my $new_string = $old_string =~ s/\r\n$/\n/g
给空字符串也不起作用。
我在这里搞砸了什么?
3 回答
您最初尝试的问题在于$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
绑定替换。
这个
my $new_string = $old_string =~ s/\r\n/\n/g
返回替换的数量,而不是新的字符串。要查看新字符串,就print $old_string
在替换之后。
从perlop:
s/PATTERN/REPLACEMENT/msixpodualgcer
在字符串中搜索模式,如果找到,则用替换文本替换该模式并返回进行的替换次数。否则,它返回 false(特别是空字符串)。如果使用 /r (非破坏性)选项,则它会在字符串的副本上运行替换,而不是返回替换的数量,而是返回是否发生替换的副本。使用 /r 时,原始字符串永远不会更改。副本将始终是纯字符串,即使输入是对象或绑定变量。
您正在替换$old_string
并且$new_string
仅包含已完成的替换次数,因此请使用括号更改操作的优先级,
(my $new_string = $old_string) =~ s/\r\n/\n/g;