【问题标题】:format output while writing it to the output file in perl在将输出写入 perl 中的输出文件时格式化输出
【发布时间】:2014-01-28 17:26:30
【问题描述】:

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

正则表达式:

$_ =~ s/$var/$mod{$var}/;
print "$_";

请建议我更好地格式化输出。

col1 (40spaces) col2(nspaces) coln(nspaces)

这是我的做法: 打开(我的文件,'日志') 尽管() { 如果(条件) 我的($var)=(拆分())[]; $var =~ s/xyz/xy/; 如果($var = 条件) $var = $1; } $_ =~ s/$var/$mod{$var}/; 打印“$_”

i need the output table 2nd column to be 40 spaces

【问题讨论】:

  • 你考虑过format吗? (more docs)
  • 我使用 sprintf。到目前为止,您尝试过什么?
  • 我完全是初学者,所以这是我第一次使用输出格式。由于处理是在 while 循环中即时完成的,然后使用 $_ 进行打印,有没有办法格式化输出列?

标签: regex perl


【解决方案1】:

我建议不要在整行上使用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.pm。是版本问题吗?
  • 然后安装String::Trim,或者写一个替换的trim函数。类似sub trim { $_ = shift; s/(\A\s+)|(\s+\z)//gr }
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多