Perl - 分配散列 - 为什么分配的变量被更改?
我有以下问题: 我有一个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。 对不起,但我绝对是新手。 预先感谢您。
你也许有类似
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
非常感谢你,我认为这解决了我的问题,但是你会如此善意地解释为什么需要使用dclone。每次我将散列分配给散列时,我是否应该使用它? 此致敬意, Georgi – user2110989 2013-02-26 12:38:13
我说过的散列有多少散列? – ikegami 2013-02-26 12:46:06
在这种特殊情况下,有两个散列变量,但在程序中,我使用了其他散列分配,这些散列分配用于不同的目的,我没有发现任何问题(仍然)。但没关系,我只是在理论上问。 再次感谢你,我试图提高柜台,但我有raiting少于15 :) – user2110989 2013-02-26 13:14:45
这没有证明问题。请提供可重现您的问题的最少量的可运行代码。 – ikegami 2013-02-26 12:04:02