Regex 在perl中将输出写入输出文件时格式化输出
我正在读取一个文件并根据需要进行处理。由于输出有表格,很少有列未对齐。我使用while循环来处理输入读取文件 Regexp:Regex 在perl中将输出写入输出文件时格式化输出,regex,perl,Regex,Perl,我正在读取一个文件并根据需要进行处理。由于输出有表格,很少有列未对齐。我使用while循环来处理输入读取文件 Regexp: $_ =~ s/$var/$mod{$var}/; print "$_"; 请建议我更好的方式来格式化输出 col1(40spaces)col2(nspaces)coln(nspaces) 以下是我是如何做到这一点的: 打开(MYFILE,'log') while(){ 如果(条件) 我的($var)=(拆分())[]; $var=~s/xyz/xy/; 如果($var
$_ =~ s/$var/$mod{$var}/;
print "$_";
请建议我更好的方式来格式化输出
col1(40spaces)col2(nspaces)coln(nspaces)
以下是我是如何做到这一点的:
打开(MYFILE,'log')
while(){
如果(条件)
我的($var)=(拆分())[];
$var=~s/xyz/xy/;
如果($var=条件)
$var=$1;
}
$\=~s/$var/$mod{$var}/;
打印“$\”
我建议您不要在整行中使用
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
使用严格;
使用警告;
子trim{$\uz=shift;s/(\A\s+)|(\s+\z)//gr}#或使用String::trim
我的%full\u国家/地区名称=(
英语=>“英格兰”,
SCO=>“苏格兰”,
WAL=>“威尔士”,
);
而()
{
咀嚼;
#输入列包括4个字符、5个字符和其他所有字符
我的($number,$country,$letter)=
地图修剪(美元),
m{^({4})({5})(.+)$}x;
#输出列包括4个字符、10个字符和其他所有内容
printf(
“%-4s%-10s%s\n”,
$number,
$full_country_name{$country},
$letter,
);
}
__资料__
1英语A
2上海合作组织B
3沃尔C
更新:编辑以包含修剪功能的实现。您考虑过吗?()我使用sprintf。到目前为止你都尝试了什么?我完全是初学者,所以这是我第一次使用输出格式。由于处理是在while循环中动态完成的,后来使用$进行打印,是否有方法格式化输出列?我收到一条错误消息,说找不到string/trim.pm。是版本问题吗?然后安装String::Trim,或者编写一个替换
Trim
函数。类似于sub-trim{$\u=shift;s/(\A\s+)|(\s+\z)//gr}
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