假设我有一个长度为160个字符的字符串,我想将其打印到每行30个字符的文件中(因此输出中的第5行将包含30个字符,最后一行将包含10个字符)。
是否有直接的perl命令?
答案 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::Form
或unpack()
的解决方案不同,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
。