-1

次の問題があります。csvファイルを抽出し、それらを読み取り、結果を出力するperlプログラムがあります。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 を変更したくありません。説明が下手で申し訳ありませんが、私は全くの初心者です。前もって感謝します。

4

1 に答える 1

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
于 2013-02-26T12:13:55.187 に答える