我正在尝试编辑文件的几行并创建包含所有修改的新文件
我的行不是段落格式,它看起来像下面这样,
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如果未提供,则使用
$_
作为第二个参数。在grep
或map
之外的任何地方输入$_
都是一种代码味道 - 要么它是值得命名的东西,要么可以在没有它的情况下编写。 - 要附加字符串,您可以使用
.=
运算符。
关于perl - 如何在 Perl 中打印文本文件的行时保持适当的列间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106273/