perl - 如何在 Perl 中打印文本文件的行时保持适当的列间距

标签 perl

我正在尝试编辑文件的几行并创建包含所有修改的新文件

我的行不是段落格式,它看起来像下面这样,

 R1   X XA  0i  1i   H 0i  
 R2   X XA  1i  1i   H 0i  
 R3   X XA  1i  1i   H 0i  
 R4   X XA  1i  1i   H 0i  
 R5   X XA  1i  1i   H 0i  
 R6   X XA  0i  0i   X 0i  

它们显然在行中的每个项目之间没有相等的间距,但它们是在列的基础上对齐的。 我想将 R3 第 3 项从 XA 编辑为 XAHBB 但无法保持列对齐

my $cur_line_num = 1;
while(<Sourcefile>){
            my @RowEdit = split (" ",$_);
               if($RowEdit[0]=~ m/^R3$/s){
                  $RowEdit[2]="RowEdit[2]HBB"
               }
            my $curr_line = join(" ", @RowEdit)
            print $newfile "curr_line\n";
          $cur_line_num++;

}
print "$cur_line_num\n";

我当前的输出如下所示

 R1 X XA 0i 1i H 0i  
 R2 X XA 1i 1i H 0i  
 R3 X XAHBB 1i 1i H 0i  
 R4 X XA 1i 1i H 0i  
 R5 X XA 1i 1i H 0i  
 R6 X XA 0i 0i X 0i

我的预期输出应该如下所示

 R1   X XA    0i  1i   H 0i  
 R2   X XA    1i  1i   H 0i  
 R3   X XAHBB 1i  1i   H 0i  
 R4   X XA    1i  1i   H 0i  
 R5   X XA    1i  1i   H 0i  
 R6   X XA    0i  0i   X 0i

编辑文件时如何保持列对齐?

最佳答案

这就是Text::Table用于:

#!/usr/bin/perl
use warnings;
use strict;

use Text::Table;

my $table = 'Text::Table'->new;

while (<DATA>) {
    my @RowEdit = split ' ';
    if ($RowEdit[0] eq 'R3') {
        $RowEdit[2] .= 'HBB';
    }
    $table->add(@RowEdit);
}
print $table;
print $. + 1, "\n";

__DATA__
R1   X XA  0i  1i   H 0i
R2   X XA  1i  1i   H 0i
R3   X XA  1i  1i   H 0i
R4   X XA  1i  1i   H 0i
R5   X XA  1i  1i   H 0i
R6   X XA  0i  0i   X 0i

另请注意我所做的所有其他小更改:

  • 无需使用新变量来计算行数。 Perl 已经有 $..
  • /s 更改正则表达式中 . 的行为。在不包含点的正则表达式中使用它是没有意义的。此外,如果只有一个字符串与正则表达式匹配,eq 可用于字符串相等性 - 它更易于阅读且运行速度更快。
  • split如果未提供,则使用 $_ 作为第二个参数。在 grepmap 之外的任何地方输入 $_ 都是一种代码味道 - 要么它是值得命名的东西,要么可以在没有它的情况下编写。
  • 要附加字符串,您可以使用 .= 运算符。

关于perl - 如何在 Perl 中打印文本文件的行时保持适当的列间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106273/

相关文章:

perl - 你如何破译 Perl 的 Benchmark::timestr 的输出?

arrays - Perl 中的魔法数组是什么?

perl - Perl 中的双下划线是什么?

regex - Perl Regex 抓取不规则串口输出数据

perl - 如何将参数传递给 Perl/Tk 中的子例程?

c++ - Linux 中的性能数据收集(API)

perl - 重新定义或重载反引号

perl - 如何一次处理多行字符串行

perl - 如何在 Perl 中测试对资源(缓存)的并发访问?

perl - 你如何覆盖替换操作?