Perl,比较两个哈希 - 不能使用字符串("1")作为哈希引用



请耐心等待,我从未在互联网上问过编程问题,所以我不知道如何解释自己。无论如何,继续提问。

我的目标是比较两个散列,每个散列都是数据库的内容,并更新远程数据库条目的本地数据库记录,其中远程数据库的ident的值与本地的ident记录不匹配,该记录被命名为unqiue_ident。

当远程数据库不再匹配时,我当前必须将本地数据库的状态更新为禁用。我需要使用本地数据库的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 hashn";
next; 
}
}

但是,我不知道如何使用代码来提取用于更新数据库条目的标识符。我尝试过的一种方法,对我来说似乎最有意义的是:

foreach my $test (sort keys %local_hash){
unless (exists $remote_hash{$_}){
print "$_: not found in Remote hashn";
print $test{ident};
next; 
}
}

这样,我将收到以下错误:当使用"strict refs"时,不能将字符串("1")用作HASH ref此外,如果我不调用ident,并将代码运行为:

foreach my $test (sort keys %local_hash){
unless (exists $remote_hash{$_}){
print "$_: not found in Remote hashn";
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};是空的。不过,我想,这与哈希是如何构建的有关?

这里有几个问题:

  • 您正在迭代一个键列表,并将每个键放在$test中,但您正在查看$_;循环中没有使用该变量。它可能有旧数据
  • 您正在使用标量$test(它是来自%local_hash的密钥之一)作为另一个散列

您要做的是在比较哈希之后查看远程密钥ident

根据你对问题的描述,你所需要做的就是:

if ($local_hash{status} ne $remote_hash{status}){
update( $remote_hash{ident}, $remote_hash{status} );
}

对于这两个散列,您甚至不需要循环。

如果你有一堆散列,你会在散列上循环,就像远程查询的结果一样。

最新更新