一种方法是使用普通的'Perl格式:
#!/usr/bin/perl use warnings; use strict; my($first, $second, $remainder); format STDOUT = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $first, $second,$remainder . while (<DATA>) { ($first, $second, $remainder) = split(/\s+/, $_, 3); write; } exit 0; __DATA__ ABCD TEST EFGH don't touch FOO BAR FUD don't touch
测试输出。我可能错误地列了列,但你应该明白这个想法:
$ perl dummy.pl ABCD TEST EFGH don't touch FOO BAR FUD don't touch
其他选择是 文字::表
假设数据中的字段由空格划分
while (<$fh>) { my ($first, @rest) = split; printf "%-35s @rest\n", $first; }
第一个区域现在将是36宽,由于左边对齐 - 格式为 printf 。看到 的sprintf 对于许多细节。其余部分在原始空格分隔的字段之间打印有单个空格,但可以根据需要进行打印(制表符分隔,固定宽度...)。
-
printf
或者你可以通过将线分成两部分来保持第一个字段之后的“休息”
while (<$fh>) { my ($first, $rest) = /(\S+)\s+(.*)/; printf "%-35s $rest\n", $first; }
(或使用 split ' ', $_, 2 而不是正则表达式)
split ' ', $_, 2
如果有其他要求,请提供更多详细信息。