perl - Perl - 具有修改数据的新哈希项,来自另一个条目的馈线哈希,破坏了第一个条目
问题描述
我正在尝试添加一个哈希条目和一个新的、更新的哈希条目,它们源自相同的馈线哈希和原始数据。
但是,当我更新第二个条目的数据时......它破坏了原始条目......即使该数据没有改变......它只能因为两者都是从同一个馈线哈希条目分配而改变的。
这是我为测试此问题而创建的测试程序的示例子例程 - 它使用 Tk 作为输出...
sub hash_issue {
my %feeder = ();
my %global = ();
my %personal = ();
my $key = 'John';
my $new_key = 'Johnathan';
$feeder{$key}{First_Name} = 'John';
$feeder{$key}{Last_Name} = '';
$feeder{$key}{Address} = '123 Main Street';
$feeder{$key}{City} = 'Springfield';
$feeder{$key}{State} = '';
$feeder{$key}{Zip} = '';
$feeder{$key}{Is_Registered} = 0;
$global{$key} = $feeder{$key};
$main->Output->Append("First Name = $global{$key}{First_Name} Last Name = $global{$key}{Last_Name} Address = $global{$key}{Address} Registered = $global{$key}{Is_Registered}\r\n");
$global{$new_key} = $feeder{$key};
$global{$new_key}{First_Name} = $new_key;
$global{$new_key}{Is_Registered} = 1;
$main->Output->Append("First Name = $global{$key}{First_Name} Last Name = $global{$key}{Last_Name} Address = $global{$key}{Address} Registered = $global{$key}{Is_Registered}\r\n");
$main->Output->Append("First Name = $global{$new_key}{First_Name} Last Name = $global{$new_key}{Last_Name} Address = $global{$new_key}{Address} Registered = $global{$new_key}{Is_Registered}\r\n");
}
这是输出...
名字 = John 姓氏 = 地址 = 123 Main Street Registered = 0
名字 = Johnathan 姓氏 = 地址 = 123 Main Street Registered = 1
名字 = Johnathan 姓氏 = 地址 = 123 Main Street Registered = 1
(为清理帖子添加了额外的行...)
我怎样才能修改它以防止破坏原始条目......真正的代码包含更多子哈希的密钥。
解决方案
你的问题在这里
$global{$new_key} = $feeder{$key};
这仅复制参考。如果你想要一个实际的副本,你需要克隆你的数据。
use Clone qw( clone );
$global{$new_key} = clone( $feeder{$key} );
推荐阅读
- javascript - 错误:等待仅在异步函数中有效
- html - 浏览器是否默认在后台将 HSL 转换为 RGB?
- assembly - 如何在 lldb 上打印程序集全局字符串变量
- python - 如何在python中按照确切的术语打印单词
- javascript - 条件渲染在我的功能组件中不起作用
- node.js - 所以我试图使用 discord.js V12 发出禁令命令,无论如何我总是遇到同样的错误
- r - R - 子集 - 基于列值的 grepl 选择排除行
- python - 修改多维 Numpy 数组
- python - TypeError:字符串索引必须是整数 Json.py
- typescript - 如何在 TS 中为具有原型方法的类编写接口?