深度克隆对象和Log4perl

深度克隆对象和Log4perl,perl,clone,log4perl,storable,Perl,Clone,Log4perl,Storable,我正在使用Storable的dclone()创建各种复杂对象的副本,这些对象通过附加的Log4perl记录器进行自日志记录。Storable在遇到logger对象时会抱怨,因为它包含coderefs。当我打开序列化代码引用的选项时,会收到不祥的警告 Useless use of a constant (???) in void context at (eval 1668) line 16. Useless use of a constant (???) in void context at (e

我正在使用Storable的
dclone()
创建各种复杂对象的副本,这些对象通过附加的Log4perl记录器进行自日志记录。Storable在遇到logger对象时会抱怨,因为它包含
code
refs。当我打开序列化代码引用的选项时,会收到不祥的警告

Useless use of a constant (???) in void context at (eval 1668) line 16.
Useless use of a constant (???) in void context at (eval 1668) line 10.
在克隆过程中,克隆对象的记录器将不再工作

我正在克隆的对象由其他对象组成,记录器可能附加到该对象、其组件及其子组件等

理想情况下,我希望克隆过程忽略任何记录器对象

1) 是否有(更)适合此任务的Perl模块?理想情况下,我希望能够控制递归复制,以便只复制非记录器的对象或数据片段

2) …还是我最好从我的对象中去掉对象的自记录功能(sob!),创建不附加到对象的记录器


任何建议或见解都将不胜感激。

您可以使用控制序列化和反序列化。我自己也没用过钩子,但它们应该会起作用

您可能能够将对象的数据复制到一个简单的散列(没有日志位),在该散列上调用
Storable::freeze
,并将其作为序列化形式返回;然后,在解冻钩子中,您只需反转该过程并连接日志记录。一点实验可能会产生一个更漂亮的解决方案,但这种“冻结对象的散列化版本”的方法应该是可行的,它将为您提供一个起点


您还可以在钩子中检测克隆,并对日志记录执行任何需要执行的操作。

部分问题在于,昨天我在尝试可能的解决方案时,Storable的钩子无法正常工作。我现在已经实现了钩子来检查日志对象并删除它们(如果它们存在的话)。。。这似乎是一个令人讨厌的黑客解决方案,但也许我会忍受它我不知道“讨厌”是否适用,但这有点像黑客。OTOH,钩子在那里是有原因的,所以它是一个黑客而不是一个混混。我想,黑客比混混更好!;^)黑客是有点体面的,乱七八糟是在有礼貌的公司里你不会谈论的东西。