我是一个试图执行以下操作的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列进行比较?或者我应该采用不同的方法吗?
答案 0 :(得分:1)
您当前的代码会在每次迭代时覆盖$hash{$column1}
的值。您可以使用push
向阵列添加新元素,而不是通过更改此行来覆盖:
$hash{$column1} = [$column2];
到
push @{ $hash{$column1} }, $column2;
请注意,您创建的数据结构不是散列哈希,而是散列数组。