2014-10-28 71 views
0

的散列我一個perl新手試圖執行以下操作:解析製表符分隔的文件到陣列

1)取用戶輸入
2)從文件1的列1匹配與該值的情況下,輸入並將來自列2的對應值存儲在散列,散列或散列散列中。 (下面的代碼存儲在數組的散列,但我不知道這是否是最佳的3以下完成)
3)我需要找到文件2中第一列的所有實例(如果它們存在)=文件中的第2列1.

爲簡單起見,我在下面提供了示例文件。

我試圖採取「AAA」的用戶輸入在所述輸入文件到一個散列或陣列的第1列,作爲密鑰對所有相應的值在第2列

我的輸入文件具有多個列1中的「AAA」實例的列2的值不同,列1 &中也有'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列?或者我應該採取不同的方式?

+0

散列密鑰是唯一的,所以你想要的結構是不可能的。另一方面[數組數組和數組哈希](http://perldoc.perl.org/perldsc.html)更有意義。 – 2014-10-28 06:53:43

回答

1

您的當前代碼將在每次迭代時覆蓋$hash{$column1}的值。您可以使用push修改這一行到一個新的元素添加到陣列中,而不是覆蓋的:

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

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

請注意,您所創建的數據結構是不是哈希散列但散列陣列

+1

謝謝@ThisSuitIsBlackNot。我將第2列中的每個值都存儲爲用戶輸入數組的散列值,但我不確定這是否是第二步我試圖解決的最佳方法,或者是否需要創建散列數據結構的散列值。 對於第二步,我想從文件1中獲取第2列的每個值,並查找它們是否存在於文件2的第1列中。 如果存在,我想打印文件2的第2列。 – CJ87 2014-10-28 13:57:56

+1

@ CJ87你只在你的問題中提到過一個文件...會是file1還是file2?通常,爲了檢查值Y是否存在於一組值X中,可以將所有X存儲在散列中,並檢查是否存在$ hash {$ Y}'。如果你還不確定如何做第二步,你應該問一個新問題,但我會這樣做:1)將file1,column2讀入散列。 column1是不必要的,所以就忽略它。 2)通過file2循環。如果column1存在於散列中,則輸出column2。文件2中的任何內容都不需要存儲在散列中,因爲您可以在處理它時打印每一行。 – ThisSuitIsBlackNot 2014-10-28 14:22:35

+1

此外,它似乎像這個特定的職位是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。沒關係,有時候他們很難避免,但是如果你總是解釋*你想要完成的是什麼,而不是*你想怎麼做,你通常會得到更好的答案。你在上面的評論中的解釋是*正確*提問的方式的一個很好的例子。如果你在開始時解釋你的目標,你通常不得不提出更少的後續問題。 – ThisSuitIsBlackNot 2014-10-28 14:25:48

相關問題