我想知道如何在X个字符后添加换行符(即/n
或<br>
)。
例如,假设我有一个perl变量$ message =“aaaaabbbbbcccccdd”。我想在每5个字符后添加一个换行符到这个变量。因此,当我在html中打印变量时,它将显示:
aaaaa
bbbbb
ccccc
dd
最好的方法是什么?有人告诉我使用substr或count函数,但我不知道如何去做。任何帮助将不胜感激。谢谢!
答案 0 :(得分:9)
更短的选择。
$m = "aaaaabbbbbcccccdd";
$m =~ s/(.{1,5})/$1\n/gs;
print $m;
输出:
aaaaa
bbbbb
ccccc
dd
当然,我认为我的版本是迄今为止最好的版本。 ;)
答案 1 :(得分:4)
我听说最有效的方法是使用解包:
say for unpack "(A5)*", "012345678901234567890123456879"
输出:
01234
56789
01234
56789
01234
56879
答案 2 :(得分:4)
基于马萨的回答,我会这样做:
$message = join("\n", unpack('(A5)*', $message ))
运行它,
$ perl
use strict;
use warnings;
my $message = "aaaaabbbbbcccccdd";
$message = join("\n", unpack("(A5)*", $message));
print $message;
^D
aaaaa
bbbbb
ccccc
dd
将“\ n”替换为您想要实际终止每一行的任何内容(例如,“\&lt; br&gt; \ n”。)
答案 3 :(得分:3)
在perl中,有很多方法可以完成同样的事情; - )
他们可能是:
$message = "aaaaabbbbbcccccdd";
$splitmessage = join ("\n", ( $message =~ /.{1,5}/gs ));
print $splitmessage, "\n";
输出:
aaaaa
bbbbb
ccccc
dd
答案 4 :(得分:0)
因为看起来你正试图包装文字,所以我会看Text::Wrap
之类的东西答案 5 :(得分:0)
unpack方法可能是最有效的,如果有点钝。正则表达式方法可能是最常用的方法。但是因为这是Perl,所以有不止一种方法可以做到这一点,所以这里有一些其他有趣的方法可以做到这一点:
使用List::MoreUtils::natatime
(“n-at-a-time”)。这种方法当然非常浪费内存,为字符串中的每个字符创建一个标量。
use List::MoreUtils qw(natatime);
my $in = "aaaaabbbbbcccccdd";
my $out = '';
my $it = natatime 5, split //, $in;
while(my @chars = $it->()) {
$out .= $_ for @chars;
$out .= "\n";
}
使用substr
的“替换”参数拼接换行符,从最后开始工作:(你必须从最后开始工作,因为否则在你开始添加换行符之后不再进一步抵消;也可以从结束意味着你只在循环开始时计算length $in
而不使用额外的变量)
for(my $i = length($in) - length($in) % 5; $i; $i -= 5) {
substr($in, $i, 0, "\n");
}
如果您想保持输入变量不变,可以预先计算所有偏移并使用substr
foreach (map $_ * 5, 0 .. int(length($in) / 5)) {
$out .= substr($in, $_, 5) . "\n";
}
使用substr
可能最简洁的方法是使用替换并连接返回值:
$out .= substr($in, 0, 5, '') . "\n" while $in;
答案 6 :(得分:-1)
substr($string, 0, 5);
将这与一些变量结合起来:
$x = 0;
$newstring = '';
while(length($string)<$x){
$newstring = $newstring + substr($string, $x, ($x+5)) + '\n';
$x = $x + 5;
}
答案 7 :(得分:-1)
答案 8 :(得分:-2)
echo 123456789abcd|perl -ne'print "$1\n" while s/(^.{5})//;print;'