2014-06-06 28 views
3

我爲僞劣標題道歉;我不知道如何正確描述我遇到的問題。我如何跟蹤某些元素是其中一部分的分組?

我有以下格式的多個製表符分隔文件:

groupA donuts  apples 
groupB car  dog  ball  meter 
groupC apples  donuts  car 
groupD ball  shirt  pencil paper  donuts 

具有不同的行數。

對於每一行,第一個單詞是組名,而其餘的行是對象的名稱。 我想要做的是跟蹤每個對象所屬的組。 所以在這個例子中,我會發現ballgroupDgroupB的一部分,而car只是groupC的一部分。​​是groupAgroupC的一部分,而pencil僅是groupD的一部分。

由於我讀的每個文件的行數/組數不相同,因此完成此操作的最佳方法是什麼?

#!/usr/bin/perl 
use strict; 
use warnings; 

my $path = "../GENELIST.symbols.csv"; 
open(PATH, $path) || die "cannot open csv\n"; 
my @groups =(); 
while(my $line = <PATH>){ 
    if($line =~ /^(\w+)\t/){ 
     push(@groups, $1); 
    } 
} 
close(PATH); 
#at this point I have the name of all the groups in the particular file (`groupA`, `groupB`, `groupC`, `groupD`). 

回答

6

只需使用數組的散列。

要更熟悉這樣的結構,退房:Perl Data Structures Cookbook

use strict; 
use warnings; 

my %groups; 

while (<DATA>) { 
    my ($group, @cols) = split; 
    push @{$groups{$_}}, $group for @cols; 
} 

use Data::Dump; 
dd \%groups; 

__DATA__ 
groupA donuts  apples 
groupB car  dog  ball  meter 
groupC apples  donuts  car 
groupD ball  shirt  pencil paper  donuts 

輸出:

{ 
    apples => ["groupA", "groupC"], 
    ball => ["groupB", "groupD"], 
    car => ["groupB", "groupC"], 
    dog => ["groupB"], 
    donuts => ["groupA", "groupC", "groupD"], 
    meter => ["groupB"], 
    paper => ["groupD"], 
    pencil => ["groupD"], 
    shirt => ["groupD"], 
} 
+0

什麼的簡潔的典範! –

相關問題