如何在Perl中添加X个字符后添加换行符?

时间:2009-09-30 14:14:45

标签: perl

我想知道如何在X个字符后添加换行符(即/n<br>)。

例如,假设我有一个perl变量$ message =“aaaaabbbbbcccccdd”。我想在每5个字符后添加一个换行符到这个变量。因此,当我在html中打印变量时,它将显示:

aaaaa 
bbbbb 
ccccc 
dd    

最好的方法是什么?有人告诉我使用substr或count函数,但我不知道如何去做。任何帮助将不胜感激。谢谢!

9 个答案:

答案 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)

只需将字符串传递给此正则表达式:

=~ s/([^\n]{5})/$1\n/g

你应该没事。

如果你真正拥有的不是随机字符的随机字符串,而是文本 - 你可能想要使用Text::Wrap模块。

答案 8 :(得分:-2)

echo 123456789abcd|perl -ne'print "$1\n" while s/(^.{5})//;print;'