0

我是尝试执行以下操作的 perl 新手:

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

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

我正在尝试将输入文件第 1 列中的用户输入“AAA”转换为哈希或数组,作为第 2 列中所有相应值的键。

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

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

输入文件示例。

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 列进行比较?还是我应该以不同的方式处理它?

4

1 回答 1

1

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

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

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

请注意,您正在创建的数据结构不是哈希的哈希,而是数组的哈希。

于 2014-10-28T06:50:10.713 回答