Regex 在perl中将输出写入输出文件时格式化输出

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

我正在读取一个文件并根据需要进行处理。由于输出有表格,很少有列未对齐。我使用while循环来处理输入读取文件

Regexp:

$_ =~ 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