Perl - 分配哈希 - 为什么分配的变量被更改?

时间:2013-02-26 11:59:22

标签: perl hash variable-assignment

我有以下问题: 我有一个perl程序,它提取csv文件,读取它们并输出结果。 有关csv结构的信息是XML文件,在上面提到的档案中提供。 在旧版本的程序中,我已经为CSV文件的每一行读取了那些XML文件,并且工作正常:

...;
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。 对不起描述不好,但我绝对是新手。 提前谢谢。

1 个答案:

答案 0 :(得分: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