我正在阅读文件并根据需要进行处理。由于输出具有表格,因此很少列未对齐。我正在使用while循环来处理输入读取文件。
正则表达式:
$_ =~ s/$var/$mod{$var}/;
print "$_";
请建议我更好地格式化输出。
col1 (40spaces) col2(nspaces) coln(nspaces)
这是我如何做到的: 开(MYFILE, '登录') while(){ 如果(条件) 我的($ var)=(split())[]; $ var = ~s / xyz / xy /; if($ var = condition) $ var = $ 1; } $ _ = ~s / $ var / $ mod {$ var} /; 打印“$ _”
i need the output table 2nd column to be 40 spaces
答案 0 :(得分:2)
我建议不要在整行上使用s///
,而应将行拆分为字段,对每个字段执行所需操作,然后使用printf
输出格式化的行。像这样:
use strict;
use warnings;
sub trim { $_ = shift; s/(\A\s+)|(\s+\z)//gr } # or use String::Trim
my %full_country_name = (
ENG => 'England',
SCO => 'Scotland',
WAL => 'Wales',
);
while (<DATA>)
{
chomp;
# Input columns are 4 chars, 5 chars, and everything else
my ($number, $country, $letter) =
map trim($_),
m{^ (.{4}) (.{5}) (.+) $}x;
# Output columns are 4 chars, 10 chars, and everything else
printf(
"%-4s%-10s%s\n",
$number,
$full_country_name{$country},
$letter,
);
}
__DATA__
1 ENG A
2 SCO B
3 WAL C
编辑更新:以包含修剪功能的实现。