2015-11-25 41 views
0

我讀過參考文檔,但我無法弄清楚如何取消引用數組中的數組引用。 不明白爲什麼@{$HoA{$cols[0]}}只打印數組的長度。任何澄清非常感謝。Perl中的引用數組

file.txt

aa  bb 
    bb  cc 

程序:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

# my $filename = "file.txt"; 
my @newarray; 

my %HoA = (
     aa  => [ "GAT_1", "GAT_2", "GAT_3", "GAT_4" ], 
     bb  => [ "GAT_6", "GAT_1", "GAT_5", "GAT_4", "GAT_2" ], 
     cc  => [ "GAT_6", "GAT_4", "GAT_3", "GAT_1", "GAT_2" ], 
    ); 

open (FILE, '<' ,"$filename") or print "$filename does not exist\n"; 


while (<FILE>) { 
    my @cols = split; 
    $cols[0] = $HoA{ $cols[0] }; 
    #$cols[0] = @{$HoA{ $cols[0]} }; 
    $cols[1] = $HoA{ $cols[1] }; 
    #$cols[1] = @{$HoA{ $cols[1] }}; 
    push (@newarray, join(" ", @cols)); 
} 

close FILE; 

print Dumper(\@newarray); 

這是我期望的輸出:

$VAR1 = [ 
      [ 
      [ 
       'GAT_1', 
       'GAT_2', 
       'GAT_3', 
       'GAT_4' 
      ], 
      [ 
       'GAT_6', 
       'GAT_1', 
       'GAT_5', 
       'GAT_4', 
       'GAT_2' 
      ], 
     [ 
       'GAT_6', 
       'GAT_1', 
       'GAT_5', 
       'GAT_4', 
       'GAT_2' 
      ], 
      [ 
       'GAT_6', 
       'GAT_4', 
       'GAT_3', 
       'GAT_1', 
       'GAT_2' 
      ], 

      ] 
     ]; 

這是我的實際輸出:

$VAR1 = [ 
      'ARRAY(0x7f80110060e8) ARRAY(0x7f801102eb58)', 
      'ARRAY(0x7f801102eb58) ARRAY(0x7f801102f308)' 
     ]; 
+0

Re「*我無法弄清楚如何取消引用數組中的數組引用*」,從技術上講,你是否正在引用它。你期待什麼輸出? – ikegami

+0

Re「*不明白爲什麼'@ {$ HoA {$ cols [0]}}'只輸出數組的長度*」,'@ {$ HoA {$ cols [0]}}'不會打印什麼。標量上下文中的「@ a」計算數組中元素的數量。因此,標量上下文中的「@ {REF}」將評估引用數組中元素的數量。 – ikegami

+0

您的預期產出是什麼?你的連接將數組引用視爲字符串,但沒有預期的輸出,很難知道你應該做什麼 – ysth

回答

4

最大的問題是這一行:

push (@newarray, join(" ", @cols)); 

join本質上是一個字符串操作:@cols是引用數組,其中join然後盡職盡責地stringifies,以便它可以與" "加入他們的行列。

好像你真正想要的大概是這樣的:

push (@newarray, [@cols]); 

其中[ ... ]符號創建一個新的匿名數組(在這種情況下@cols與值填充),並返回一個參考吧。

此外,代替這樣的:

$cols[0] = $HoA{ $cols[0] }; 

(導致@newarray%HoA落得含有相同的基礎數組的引用),則可以希望此:

$cols[0] = [ @{$HoA{ $cols[0] }} ]; 

(這樣@newarray結束於完全獨立的陣列,它們只是以與%HoA中相同的數據開始)。這取決於你是否打算在之後修改任何數組。

+0

謝謝,就是這樣! – cmvdi01