2014-01-30 26 views
3

我有一個文件,我想讀的是具有可變號碼ID的每個位置的,看起來像這樣:如何將可變長度的行分配給perl中的變量?

loc1 id1 id4 id5 id9 
loc2 id2 
loc3 id1 id11 id23 

我想存儲該如下LOCS(LOC)= {屬於所有IDS該位置} 以至於後來,當我讀到另一個文件我可以這樣做

if (grep id, locs(loc)){do something} 

我試圖做到這一點使用的哈希,但是這是行不通的。我嘗試過:

open my $loclist, '<', $ARGV[0]; 
my %locs; 
while (<$loclist>) { 
my @loclist_rec = split; 
my $loclist_loc = @rlist_rec[0]; 
$locs{$loclist_loc} = @loclist_rec; 
} 

但這是行不通的。 我是perl的新手,仍然試圖理解不同的數據類型。

任何想法?非常感謝!

+1

您需要了解數組和數組引用之間的區別。你需要做的就是'$ locs {$ loclist_loc} = \ @loclist_rec;'將一個_reference_賦值給哈希值。 –

+0

每個人都使用[引用](http://perldoc.perl.org/perlref.html)給你一個答案。你需要的是[Perl參考教程](http://perldoc.perl.org/perlref.html)。當你有陣列數組或哈希陣列哈希時,引用是很棒的。或者任何形式的複雜結構都不能很好地融入到Perl原來的三種變量類型中。閱讀教程,一切都將變得清晰。 –

+0

非常感謝,也爲本教程!那就是我所需要的:) – madieke

回答

6

這應該做你想做的。

#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 

open my $loclist, '<', "test.txt" or die $!; 
my %locs; 

while (<$loclist>) { 
    my ($loclist_loc, @loclist_rec) = split; 
    $locs{$loclist_loc} = \@loclist_rec; 
} 

print Dumper \%locs; 

OUTPUT:

$ perl test.pl 
$VAR1 = { 
      'loc2' => [ 
         'id2' 
        ], 
      'loc1' => [ 
         'id1', 
         'id4', 
         'id5', 
         'id9' 
        ], 
      'loc3' => [ 
         'id1', 
         'id11', 
         'id23' 
        ] 
     }; 
+0

謝謝!我也喜歡Dumper。 – madieke

0

另外一個可能的選擇是哈希散列。當你想查找一個ID,你可以說if ($locs{$loc}{$id}) {do something}。數據結構將是

$VAR1 = { 
      'loc2' => { 
         'id2' => 1 
        }, 
      'loc1' => { 
         'id1' => 1, 
         'id5' => 1, 
         'id4' => 1, 
         'id9' => 1 
        }, 
      'loc3' => { 
         'id1' => 1, 
         'id11' => 1, 
         'id23' => 1 
        } 
     }; 
相關問題