加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:03:20 所属栏目:大数据 来源:网络整理
导读:对于我来说,编程非常新鲜,因为我不知道如何解释这个问题,我深表歉意. 我有一个Perl脚本从内部工具获取变量.这并不总是它看起来像,但它将始终遵循这种模式: darren.local 1987 A Sentence1darren.local 1996 C Sentence2darren.local 1991 E Sentence3darren
对于我来说,编程非常新鲜,因为我不知道如何解释这个问题,我深表歉意.

我有一个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 ...
      }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读