对于我来说,编程非常新鲜,因为我不知道如何解释这个问题,我深表歉意.
我有一个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这样的事情.它快速,灵活,可逆.
你只需要知道每一列的位置,并且打包可以自动修剪每一列的额外空格.
如果您在其中一列更改某些内容,可以使用相同的格式重新打包,轻松将其包装到原始格式:
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,$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
现在还有一个考虑.听起来你可能在单个变量中有这么多的多行文本.通过在标量的引用上打开文件句柄来处理这个文件. filehandle的东西照顾其余的:
my $lines = '...multiline string...'; open my($fh),'<',\ $lines; while( <$fh> ) { ... same as before ... }