将数组切片为哈希值

时间:2014-04-28 07:35:15

标签: perl hash slice

我想要做的是将元素[1..3]组合成一个数组,然后将其中的内容组合起来。然后按键排序并打印出整个内容。

#!/usr/bin/perl
my %hash ; 
while ( <> ) {
    @elements = split /,/, $_;
    @slice_elements = @elements[1..3] ;
    if ($elements[0] ne '' ) {
        $hash{ $elements[0] } = $slice_elements[0];
    }
}

foreach $key (sort keys %hash ) {
       print "$key; $hash{$key}\n";
}

这是我打印出来时的结果 -

casper_mint@casper-mint-dell /tmp $ /tmp/dke /tmp/File1.csv


060001.926941; TOT
060002.029434; RTP
060002.029568; RTP
060002.126895; UL
060002.229327; RDS/A
060002.312512; EON
060002.429382; RTP
060002.585408; BCS
060002.629333; LYG
060002.712240; HBC

这是我想要数组的元素 - 元素[0]是值中的键和元素[1..3]

060001.926941,TOT,86.26,86.48
060002.029434,RTP,310.0,310.66
060002.029568,RTP,310.0,310.74
060002.126895,UL,34.06,34.14
060002.229327,RDS/A,84.47,84.72
060002.312512,EON,56.88,57.04
060002.429382,RTP,310.08,310.77
060002.585408,BCS,58.96,59.06
060002.629333,LYG,46.13,46.41
060002.712240,HBC,93.06,93.23

1 个答案:

答案 0 :(得分:2)

始终在每个perl脚本的顶部包含use strict;use warnings;

您需要创建一个新的匿名数组[ ]作为哈希值。然后join显示结果时的值:

#!/usr/bin/perl
use strict;
use warnings;

my %hash;

while (<>) {
    chomp;
    my @elements = split /,/, $_;
    if ($elements[0] ne '' ) {
        $hash{ $elements[0] } = [@elements[1..3]];
    }
}

foreach my $key (sort keys %hash ) {
    print join(',', $key, @{$hash{$key}}) . "\n";
}

当然,如果您的数据确实是固定的宽度,并且您实际上没有对这些值执行任何操作,则实际上不需要splitjoin。以下内容可以做同样的事情:

use strict;
use warnings;

print sort <>;