我有以下问题: 我有一个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。 对不起描述不好,但我绝对是新手。 提前谢谢。
答案 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