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

时间:2014-02-27 22:17:01

标签: perl loops for-loop hash foreach

请耐心等待我,我从未在互联网上询问过编程问题,所以我不确定如何解释自己。在任何情况下,都有问题。

我的目标是比较两个哈希值,每个哈希值都是数据库的内容,并更新本地数据库的远程数据库条目的记录,其中远程数据库的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};是空的。 我想,这与哈希的构建方式有关吗?

1 个答案:

答案 0 :(得分:3)

这里有一些问题:

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

您想要做的是在比较哈希值后查看遥控钥匙ident

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

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

对于这两个哈希,你甚至不需要循环。

如果你有一堆哈希,你可以在哈希循环中执行此操作,就像远程查询的结果一样。