编程对我来说太陌生了,我很抱歉不知道如何表达这个问题。
我有一个从内部工具获取变量的 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/