gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:54:29 24 4
gpt4 key购买 nike

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

我有一个从内部工具获取变量的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com