2012-05-11 73 views
0

我試圖把一個散列%listvol放入Perl中的數組@fileInfo爲什麼我通過迭代這個散列獲得相同的值?

@fileInfo = ($filename, $data, $index, \%listvol); 

%listvol包含體積的列表:鍵= $vol,值= $vol。 第一個$vol的值是ABCDEF,然後是GFFFFEEEAA - 總是不一樣。

然後我把陣列@fileInfo哈希%listeAllFile

$listeAllFile{$nameOfFile} = [@fileInfo]; 

後來我試圖讓哈希%listvol沒有成功。我使用這個代碼:

foreach $key (keys %listeAllFile) { 
    @tab  = @{ $listeAllFile{$key} }; 
    $filename = $tab[0]; 
    %listvol = %{ $tab[3] }; 
    foreach $vol (keys %listvol) { 
     print "\n vol is $vol for file $filename"; 
    } 

文件名總是不一樣的,所以它沒問題。但變量$vol的值始終相同,ABCDEF。我似乎每次都得到相同的價值。

有沒有人有想法?

+4

[適用於我]。(http://paste.scsys.co.uk/197007?ln=on&hl=on)您在問題描述中遺漏了一些內容,並且問題必須隱藏在那裏。 - [編輯你的問題](http://stackoverflow.com/posts/10548834/edit)爲[提供一個展示該問題的完整可運行程序](http://sscce.org),包括將示例數據分配給相關變量。 – daxim

+1

看起來你並沒有使用'use strict',Patrick。如果有的話,可以通過使用範圍縮小的詞法變量來避免這個問題,而不是全局的變量。 – TLP

回答

2

雖然你不包括代碼重現你的問題,我相當肯定,問題是,你要保存每個陣列中的相同%listvol散列的引用。

當您更改第二個條目的%listvol的內容時,您將同時修改第一個條目。解決該問題的一種方法是使用{%listvol}而不是\%listvol。前者製作%listvol的當前內容的淺拷貝,就像[@fileInfo]製作@fileInfo的當前內容的淺拷貝。

+0

ok。您說得對,%listvol可能使用相同的指針。它適用於{%listvol}。非常感謝你。 – Patrick

相關問題