请耐心等待我,我从未在互联网上询问过编程问题,所以我不确定如何解释自己。在任何情况下,都有问题。
我的目标是比较两个哈希值,每个哈希值都是数据库的内容,并更新本地数据库的远程数据库条目的记录,其中远程数据库的ident的值与本地的ident记录不匹配,被命名为unqiue_ident。
当远程不再匹配时,我当前必须将本地数据库的状态更新为禁用。我需要使用本地db的ident作为conidtion。例如更新本地设置状态='禁用',其中ident ='1'。
我可以使用下面的代码将哈希值与阳性结果进行比较。
use strict;
my %remote_hash = (
ident => '1001',
name => 'remote hash name',
);
my %local_hash = (
ident => '1',
remote_ident => '1001',
name => 'remote hash name',
status => 'active'
);
foreach (sort keys %local_hash){
unless (exists $remote_hash{$_}){
print "$_: not found in Remote hash\n";
next;
}
}
但是,我不明白如何使用代码来提取更新db条目的ident。我试过的方法之一,似乎对我来说最有意义的是:
foreach my $test (sort keys %local_hash){
unless (exists $remote_hash{$_}){
print "$_: not found in Remote hash\n";
print $test{ident};
next;
}
}
有了这个,我将收到以下错误:无法使用字符串(“1”)作为HASH参考,而“严格参考”在使用中 另外,如果我不调用ident,并将代码运行为:
foreach my $test (sort keys %local_hash){
unless (exists $remote_hash{$_}){
print "$_: not found in Remote hash\n";
next;
}
}
它打破了整个事情,并将所有记录视为不匹配。 我不知道如何进一步解决这个问题。有人能协助我指出纠正我遇到的问题的方向吗?
编辑 - 回复simbabque。我想我对哈希表达了严重的歪曲。 这是对所讨论的哈希的更好细分。
转储远程哈希时,这就是我得到的。
$VAR1 = '1001';
$VAR2 = 'NAME 1';
$VAR3 = '1002';
$VAR4 = 'NAME 2';
$VAR5 = '1003';
$VAR6 = 'NAME 3';
$VAR7 = '1004';
$VAR8 = 'NAME 4';
$VAR9 = '1005';
转储本地哈希时,我得到:
$VAR1 = [
{
'ident' => '1',
'group_name' => 'NAME 1',
'status' => 'active',
'unique_id' => '1001',
},
对于远程哈希,我通过执行以下操作将数组转换为哈希:
my %remote_hash;
foreach my $data_pair( @remote_hash_list){
my $ident = $data_pair->{ident};
my $group_name = $data_pair->{sched_group};
$group_name =~ s/\s+$//g;
$remote_hash{$ident} = $group_name;
}
我有点想要这个,所以我不确定这是否是将数组转换为哈希的正确方法。如果我转储数组@remote_hash_list,我得到:
$VAR1 = {
'ident' => 1001,
'sched_group' => 'NAME 1',
};
当我尝试你解释的方法时,$ hash {value};是空的。 我想,这与哈希的构建方式有关吗?
答案 0 :(得分:3)
这里有一些问题:
$test
中,但您正在查看$_
;你的循环中没有使用该变量。它可能有旧数据。$test
(这是%local_hash
中的一个键)作为另一个哈希值。您想要做的是在比较哈希值后查看遥控钥匙ident
。
根据您对问题的描述,您需要做的就是:
if ($local_hash{status} ne $remote_hash{status}){
update( $remote_hash{ident}, $remote_hash{status} );
}
对于这两个哈希,你甚至不需要循环。
如果你有一堆哈希,你可以在哈希循环中执行此操作,就像远程查询的结果一样。