将制表符分隔文件解析为数组的哈希值

时间:2014-10-28 06:44:38

标签: perl hash hash-of-hashes

我是一个试图执行以下操作的perl新手:

1)取一个用户输入
2)将输入与来自文件1的column1的该值的实例匹配,并将来自列2的对应值存储在散列,数组散列或散列散列中。 (下面的代码存储在数组的散列中,但是我不确定这是否是最佳的,以完成下面的3) 3)我需要找到文件2中第一列的所有实例(如果存在)=文件1中的第2列。

为简单起见,我在下面提供了示例文件。

我试图接受用户输入的AAA'在输入文件的第1列中将其作为散列或数组,作为第2列中所有相应值的键。

我的输入文件有多个' AAA'在第1列中,第2列的值不同,也有多个“AAA”的实例。和' BBB'在第1栏和第1栏中2.我相信为了正确输出这个,我需要使用哈希哈希,但我不确定语法是如何处理它。

我已经尝试过搜索这个网站并找到了一些例子,但我担心我只会让自己更加困惑。

输入文件示例。

AAA     BBB
AAA     CCC
AAA     BBB
BBB     DDD
CCC     AAA

我的代码示例

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;
use Data::Dumper;

#declare values
my %hash = ();

#Get protein name from user
print "Get column 1 value: ";
my $value = <STDIN>;
chomp $value;

#open input file
open FILE, "file" or die("unable to open file\n"); 

    while(my $line = <FILE>) {
        chomp($line);
        my($column1, $column2) = split("\t", $line);

        if ($column1 eq $value) {
        push @{ $hash{$column1} }, $column2;
        }

    }

    close FILE;

    print Dumper(\%hash);

代码输出

$VAR1 = {
         'AAA' => [
                    'BBB',
                    'CCC'
                  ]
        };

我的问题是,我当前的数组设置哈希是否最适合读取文件2中的第1列并将其与文件1的第2列进行比较?或者我应该采用不同的方法吗?

1 个答案:

答案 0 :(得分:1)

您当前的代码会在每次迭代时覆盖$hash{$column1}的值。您可以使用push向阵列添加新元素,而不是通过更改此行来覆盖:

$hash{$column1} = [$column2];

push @{ $hash{$column1} }, $column2;

请注意,您创建的数据结构不是散列哈希,而是散列数组