在perl中每行打印固定的字符数

时间:2014-06-25 16:45:19

标签: perl printing

假设我有一个长度为160个字符的字符串,我想将其打印到每行30个字符的文件中(因此输出中的第5行将包含30个字符,最后一行将包含10个字符)。

是否有直接的perl命令?

5 个答案:

答案 0 :(得分:4)

使用unpack

更清晰,更简洁
my $s = join('', 'A' .. 'J') x 16;

print "$_\n" for unpack '(A30)*', $s;

<强>输出

ABCDEFGHIJABCDEFGHIJABCDEFGHIJ
ABCDEFGHIJABCDEFGHIJABCDEFGHIJ
ABCDEFGHIJABCDEFGHIJABCDEFGHIJ
ABCDEFGHIJABCDEFGHIJABCDEFGHIJ
ABCDEFGHIJABCDEFGHIJABCDEFGHIJ
ABCDEFGHIJ

答案 1 :(得分:3)

您可以每30个字符插入换行符

$string =~ s/.{1,30}\K/\n/sg;

或使用@Miller解决方案的变体,

while ($string =~ m/(.{1,30})/gs) {
  print $1, "\n";
}

答案 2 :(得分:1)

使用正则表达式,利用贪婪匹配:

my $string = 'a' x 160;

for my $buffer ($string =~ m/.{1,30}/gs) {
    print $buffer, "\n";
}

输出:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaa

答案 3 :(得分:0)

分成30个或更少的组,然后加入换行符:

$string = join("\n", ( $string =~ m/.{1,30}/g ));

答案 4 :(得分:0)

There's more than one way to do it! : - )

对于这项任务,我会找到Perl6::Form,一个非常强大的文本格式库。 Perl6命名空间意味着它是Perl 5的Perl 6特性的后端。

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

use Perl6::Form;

my $s = join('', 'A' .. 'J') x 16;

say form "{" . ("[" x 30) . "}", $s;

输出:

$ ./line-breaks.pl
ABCDEFGHIJABCDEFGHIJABCDEFGHIJA-
BCDEFGHIJABCDEFGHIJABCDEFGHIJAB-
CDEFGHIJABCDEFGHIJABCDEFGHIJABC-
DEFGHIJABCDEFGHIJABCDEFGHIJABCD-
EFGHIJABCDEFGHIJABCDEFGHIJABCDE-
FGHIJ

注意每行末尾的“ - ”字符。这表明,与基于Perl6::Formunpack()的解决方案不同,m//g实际上处理了分词。

例如,如果我们给它一些带空格的文本,我们可以看到它是左对齐的,右边缘是粗糙的。​​

$ ./line-breaks.pl
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor incididunt
ut...

如果您将30个"["字符更改为15 "["个字符,后跟15个"]"个字符,那么您将获得完全对齐的输出。

$ ./line-breaks.pl
Lorem  ipsum  dolor  sit   amet,
consectetur  adipisicing   elit,
sed do eiusmod tempor incididunt
ut...

就像我说的那样,Perl6::Form非常强大: - )

您需要通过CPAN(/usr/bin/cpan)或您的操作系统包管理器安装它。在Debian上,您可以使用Perl6::Form在系统范围内安装sudo apt-get install libperl6-form-perl