首页 文章

Perl:嵌套哈希

提问于
浏览
0

我正在尝试编写一个脚本来生成嵌套哈希 . 我的第一个键/值对由两个标识符组成 - 第4列中的每种主要标识符在第3列中具有相应的标识符(可以是可变长度),以及第6列中的相关数值 .

我正在考虑为标识符构造一个键值对,然后在将数字标识符合并到第二个哈希值之前对键(A,B,C等)进行排序 .

Input File

CATE      1  CA   A     1       108.8
CATE      2  CB   A     1       8.33
CATE      3  CA   B     1       45.1
CATE      4  CB   B     1       3.96
CATE      5  CG   B     1       3.94
CATE      6  CA   C     1       1.96
CATE      7  CB   C     1       2.94

下面是我的脚本 - 当我运行它时,我没有得到任何输出,我不确定为什么 .

Input Script

#!/usr/bin/perl

use strict;
use warnings;

my $key;
my $value;
my %hash;
my @fields;

my $filename = 'data.txt';
open my $fh, '<', $filename or die "Can't open $filename:$!";

while(my $line = <$fh>) {
    chomp $line;
    @fields = split /\s+/, $line;
    $key = $fields[3];
    $value = $fields[2];
    $hash{$key} = $value;
}

foreach my $name (sort keys %hash) {
    foreach my $type (keys %{ $hash{$fields[5]}}) {
        print "$name, $type: $hash{$name}{$type}\n";
    }
}

Expected Hash structure

A     CA     108.8
      CB     8.33
B     CA     45.1
      CB     3.96
      CG     3.94
C     CA     1.96
      CB     2.94

2 回答

  • 1

    这是你想要的吗?

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    open my $fh, '<', \<<EOF;
    CATE      1  CA   A     1       108.8
    CATE      2  CB   A     1       8.33
    CATE      3  CA   B     1       45.1
    CATE      4  CB   B     1       3.96
    CATE      5  CG   B     1       3.94
    CATE      6  CA   C     1       1.96
    CATE      7  CB   C     1       2.94
    EOF
    
    my %data;
    
    while (<$fh>) {
        my ($key1, $key2, $val) = (split)[3,2, 5];
        $data{$key1}{$key2} = $val;
    }
    
    #use Data::Dumper; print Dumper \%data;
    
    for my $name (sort keys %data) {
        my $href = $data{$name};
        for my $type (sort keys %$href) {
            print "$name, $type, $href->{$type}\n"; 
        }   
    }
    

    产量

    A, CA, 108.8
    A, CB, 8.33
    B, CA, 45.1
    B, CB, 3.96
    B, CG, 3.94
    C, CA, 1.96
    C, CB, 2.94
    
  • 1
    #!/usr/bin/perl -w
            use strict;
            use warnings;
            use Data::Dumper;
            open(DATA, "<test.txt") ;
            open(DATA1, ">>test.txt") ;
    
            while(<DATA>){
                my $data=$_;
                $data=~s/\s+/ /ig;
               my @arr= split(' ',$data);
               my $data1 .= "$arr[3]  $arr[2] $arr[5] \n";
               #print STDERR Dumper($data1);
               print DATA1 $data1;
            }
            close(DATA);
            close(DATA1);
    

相关问题