给定一个数据结构(例如散列哈希),什么是干净/推荐的方式来制作深层副本以供立即使用?假设合理的情况,数据不是特别大,没有复杂的循环,可读性/可维护性等.不惜一切代价比速度更重要.
我知道我可以使用Storable,Clone,Clone :: More,Clone :: Fast,Data :: Dumper等.目前的最佳做法是什么?
在我开始自己编写代码并重新发明轮子之前,如何在不复制hashref的情况下复制散列哈希?
我正在通过Config :: General读取散列哈希值.即,数据结构是:
my %config = ( group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
Run Code Online (Sandbox Code Playgroud)
然后我通过解除引用来从配置中取出我的组,并在重写配置文件之前在运行时更改内容:
my %group = %{$config{'group'}};
Run Code Online (Sandbox Code Playgroud)
问题是我需要检查是否进行了更改并对系统的文件结构进行了相关更改.我不能通过检查来做到这一点:
if ($group{'item1'}{'foo'} ne $config{'group'}{'item1'}{'foo'}) {
### Stuff!
}
Run Code Online (Sandbox Code Playgroud)
as $group{'item1'}和$config{'group'}{'item1'}都是完全相同的hashref.
现在虽然简单地重新解析配置文件并在保存到磁盘之前将磁盘中已解析的副本与编辑后的版本进行比较应该是微不足道的,但我确信有一种方法可以对复杂数据结构进行嵌套解引用,复制哈希引用的内容,而不是简单地复制引用本身.对CPAN的粗略检查并没有改变任何事情.我错过了什么?
基准
得到了我的答案:
#!/usr/bin/perl
use Benchmark qw(:all) ;
use Storable qw(dclone);
use Clone qw(clone); …Run Code Online (Sandbox Code Playgroud) 帮助,我正在尝试使用metaweblogAPI over XMLRPC使用以下perl脚本在我的wordpress博客中使用自定义字段创建一个新帖子,但是自定义字段似乎存在问题.似乎只发布了第二个自定义字段(宽度).无法获得正确发布的"高度".当我添加另一个字段时,我得到"匿名哈希中奇数个元素"错误.这必须是简单的事情 - 有人会善意地检查我的语法吗?谢谢.
#!/usr/bin/perl -w
use strict;
use RPC::XML::Client;
use Data::Dumper;
my $cli=RPC::XML::Client->new('http://www.sitename.com/wp/xmlrpc.php');
my $appkey="perl"; # doesn't matter
my $blogid=1; # doesn't matter (except blogfarm)
my $username="Jim";
my $passwd='_____';
my $text=<<'END';
This is the post content...
You can also include html tags...
See you!
END
my $publish=0; # set to 1 to publish, 0 to put post in drafts
my $resp=$cli->send_request('metaWeblog.newPost',
$blogid,
$username,
$passwd,
{
'title' => "this is doodoo",
'description' => $text,
'custom_fields' => {
{ "key" …Run Code Online (Sandbox Code Playgroud)