use warnings;
use strict;
use feature 'say';
# Test with multiline string
my $ml_str = "a\n\nb\n";
$ml_str =~ s/\n/z/g; #--> azzbz (no newline at the end)
print $ml_str;
say ''; # to terminate the line above
# Or to replace two consecutive newlines (everywhere)
$ml_str = "a\n\nb\n"; # restore the example string
$ml_str =~ s/\n\n/z/g; #--> azb\n
print $ml_str;
# To replace the consecutive newlines in a file read it into a string
my $file = join '', <DATA>; # lines of data after __DATA__
$file =~ s/\n\n/z/g;
print $file;
__DATA__
one
two
last
2条答案
按热度按时间x8diyxa71#
换行符与
\n
匹配这将打印
azzb
,不带换行符,所以下一个提示符在同一行。注意,程序一次输入一行,所以不需要/g
修饰符。(这就是\n\n
不匹配的原因。)/m
修饰符与本例无关。我不知道它是以什么形式使用的,但我可以想象不是用
echo
来提供输入,那么最好用文件中的输入或多行字符串(在这种情况下可能需要/g
)来测试它。一个例子
这个打印
顺便说一句,我想提一下,使用修饰符
/s
时,.
也匹配换行符(例如,这对于匹配可能包含换行符的子字符串.*
(或.+
)很方便;如果没有/s
修饰符,则该模式在换行符处停止。)请参见perlrebackslash并搜索
newline
。†
/m
修饰符使^
和$
也匹配多行字符串 * 内部 * 的行首和行尾。将替换字符串中的换行符。然而,这个例子有一些复杂性,因为一些换行符保留了下来。
ws51t4hk2#
您一次只能对一行应用替换,并且一行永远不会有两个换行符。请改为对整个文件应用替换: