perl - 如何在 Perl 中拆分固定宽度的列?

标签 perl

编程对我来说太陌生了,我很抱歉不知道如何表达这个问题。

我有一个从内部工具获取变量的 Perl 脚本。这并不总是它的样子,但它会始终遵循以下模式:

darren.local           1987    A      Sentence1
darren.local           1996    C      Sentence2
darren.local           1991    E      Sentence3
darren.local           1954    G      Sentence4
darren.local           1998    H      Sentence5

使用 Perl,将这些行中的每一行单独放入变量中的最简单方法是什么?根据内部工具吐出的内容,每行总是不同的,并且可能超过五行。每行中的大写字母是它最终将被排序的内容(所有 As、所有 Cs、所有 Es 等)。我应该看正则表达式吗?

最佳答案

我喜欢使用 unpack对于这种事情。它快速、灵活且可逆。

你只需要知道每一列的位置,以及 unpack可以自动修剪每列中多余的空格。

如果您更改其中一列中的某些内容,通过使用相同格式重新打包很容易恢复到原始格式:

my $format = 'A23 A8 A7 A*';

while( <DATA> ) {
    chomp( my $line = $_ );

    my( $machine, $year, $letter, $sentence ) =
        unpack( $format, $_ );

    # save the original line too, which might be useful later
    push @grades, [ $machine, $year, $letter, $sentence, $_ ];
    }

my @sorted = sort { $a->[2] cmp $b->[2] } @grades;

foreach my $tuple ( @sorted ) {
    print $tuple->[-1];
    }

# go the other way, especially if you changed things
foreach my $tuple ( @sorted ) {
    print pack( $format, @$tuple[0..3] ), "\n";
    }

__END__
darren.local           1987    A      Sentence1
darren.local           1996    C      Sentence2
darren.local           1991    E      Sentence3
darren.local           1954    G      Sentence4
darren.local           1998    H      Sentence5

现在,还有一个额外的考虑。听起来您可能在单个变量中包含这么大块的多行文本。通过打开对标量的引用的文件句柄,像处理文件一样处理它。文件句柄的东西负责其余的:
 my $lines = '...multiline string...';

 open my($fh), '<', \ $lines;

 while( <$fh> ) {
      ... same as before ...
      }

关于perl - 如何在 Perl 中拆分固定宽度的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1893830/

相关文章:

perl - Perl 模块是否知道它的安装位置?

perl - 合并列表列表的列表

perl - 如何在perl脚本中捕获shell脚本的退出代码?

arrays - Perl:在 Foreach 循环中分配对数组元素的引用

perl - 为什么要在 Learning Perl,第 6 版,ch. 的 &max 子例程示例中移动数组。 4个

perl - 如何在 DBI->connect 的参数中使用空格?

perl - 如何制作一个为用户导入许多模块的模块?

perl - 始终在Perl脚本结束之前执行一些代码

perl - 是否可以使用 WWW::Mechanize::Firefox 单击 Javascript 弹出窗口?

perl - 使用 Perl HTTP::Response 和 LWP 代理 HTTP 请求的更好方法?