2013-02-26 62 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