2013-02-26 99 views
-1

我有以下問題: 我有一個perl程序,它正在提取csv文件,讀取它們並輸出結果。 有關csv結構的信息是在上述檔案中提供的XML文件中。 在舊版本我已閱讀這些XML文件CSV文件和everithing的每一行程序的精細工作:Perl - 分配散列 - 爲什麼分配的變量被更改?

...; 
foreach $b (@gz_files) 
{ 
    if (index($b, 'condition1') >= 0 
    || index($b, 'condition2') >= 0 
    || index($b, 'condition3') >= 0) 
    { 
    $lt = localtime; 
    open (my $outputfile, '>>'.'/path_to_output/'.$dir_file.'.tmp') 
     || die print $lfh "$lt -  /path_to_output/$dir_file\.tmp - $!\n"; 
    if ($b ne "") 
    { 
     # this is the procedure, which reads xml_files 
     %cv_tmp = eventstype::initialize($complex_xml_path, $rating_input_xml_path); 
     @EXPORT=qw(%cv_tmp); 
...; 

該代碼添加從XML文件的結構爲%cv_tmp變量。 在CSV文件的foreach行之後,我將%cv_tmp的值賦給進一步操作的%complex_vals。

... 
%complex_vals=%mainfile::cv_tmp; 
... 

但這種操縱我注意到%cv_tmp更改後 - 這很奇怪,因爲這是分配的右側。 我不想在每個CSV行上更改%cv_tmp。 對不起,但我絕對是新手。 預先感謝您。

+0

這沒有證明問題。請提供可重現您的問題的最少量的可運行代碼。 – ikegami 2013-02-26 12:04:02

回答

1

你也許有類似

my %h1; 
$h1{foo}{bar} = 123; 

my %h2 = %h1; 
$h2{foo}{bar} = 456; 

print "$h1{foo}{bar}\n"; # 456 

如果是這樣,你不改變%h1%h2;您正在更改由$h1{foo}$h2{foo}引用的(匿名)散列。您需要複製引用的散列(而不是引用散列)來解決此問題。

use Storable qw(dclone); 

my %h1; 
$h1{foo}{bar} = 123; 

my %h2 = %{ dclone(\%h1) }; 
$h2{foo}{bar} = 456; 

print "$h1{foo}{bar}\n"; # 123 
+0

非常感謝你,我認爲這解決了我的問題,但是你會如此善意地解釋爲什麼需要使用dclone。每次我將散列分配給散列時,我是否應該使用它? 此致敬意, Georgi – user2110989 2013-02-26 12:38:13

+0

我說過的散列有多少散列? – ikegami 2013-02-26 12:46:06

+0

在這種特殊情況下,有兩個散列變量,但在程序中,我使用了其他散列分配,這些散列分配用於不同的目的,我沒有發現任何問題(仍然)。但沒關係,我只是在理論上問。 再次感謝你,我試圖提高櫃檯,但我有raiting少於15 :) – user2110989 2013-02-26 13:14:45