Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl,比较两个哈希值-Can';t使用字符串(“1”)作为散列引用_Perl_Loops_For Loop_Hash_Foreach - Fatal编程技术网

Perl,比较两个哈希值-Can';t使用字符串(“1”)作为散列引用

Perl,比较两个哈希值-Can';t使用字符串(“1”)作为散列引用,perl,loops,for-loop,hash,foreach,Perl,Loops,For Loop,Hash,Foreach,请容忍我,我从来没有在互联网上问过编程问题,所以我不知道如何解释自己。不管怎样,请继续提问 我的目标是比较两个散列,每个散列都是数据库的内容,并更新本地数据库的远程数据库条目记录,其中远程数据库的ident值与本地数据库的ident记录不匹配,该记录名为unqiue_ident 当远程数据库不再匹配时,我当前必须将本地数据库的状态更新为禁用。我需要使用本地数据库的标识作为密码。e、 g.更新本地集状态='disabled',其中ident='1' 我能够使用下面的代码将哈希值与阳性结果进行比较

请容忍我,我从来没有在互联网上问过编程问题,所以我不知道如何解释自己。不管怎样,请继续提问

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

当远程数据库不再匹配时,我当前必须将本地数据库的状态更新为禁用。我需要使用本地数据库的标识作为密码。e、 g.更新本地集状态='disabled',其中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条目的标识。我尝试过的方法之一,对我来说最有意义的是:

foreach my $test (sort keys %local_hash){
    unless (exists $remote_hash{$_}){
        print "$_: not found in Remote hash\n";
        print $test{ident};
        next; 
    }
}
这样,我将收到以下错误:在使用“strict refs”时,不能将字符串(“1”)用作散列引用 此外,如果我不调用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\u hash\u列表,我会得到:

$VAR1 = {
          'ident'       => 1001,
          'sched_group' => 'NAME 1',
        };
当我尝试您解释的方法时,$hash{value};是空的。
不过,我认为这与哈希的构建方式有关。

这里有几个问题:

  • 您正在迭代一个键列表,并将每个键放入
    $test
    ,但您正在查看
    $\uuu
    ;该变量未在循环中使用。它可能有旧数据
  • 您正在使用标量
    $test
    (它是
    %local\u hash
    中的一个键)作为另一个hash
您要做的是在比较哈希之后查看远程键
ident

根据您对问题的描述,您只需执行以下操作:

if ($local_hash{status} ne $remote_hash{status}){
  update( $remote_hash{ident}, $remote_hash{status} );
}
对于这两个哈希,您甚至不需要循环


如果您有一组散列,您可以在散列上进行循环,就像远程查询的结果一样。

这里有几个问题:

  • 您正在迭代一个键列表,并将每个键放入
    $test
    ,但您正在查看
    $\uuu
    ;该变量未在循环中使用。它可能有旧数据
  • 您正在使用标量
    $test
    (它是
    %local\u hash
    中的一个键)作为另一个hash
您要做的是在比较哈希之后查看远程键
ident

根据您对问题的描述,您只需执行以下操作:

if ($local_hash{status} ne $remote_hash{status}){
  update( $remote_hash{ident}, $remote_hash{status} );
}
对于这两个哈希,您甚至不需要循环


如果您有一组散列,您可以在散列上进行循环,就像远程查询的结果一样。

这里有几个问题:

  • 您正在迭代一个键列表,并将每个键放入
    $test
    ,但您正在查看
    $\uuu
    ;该变量未在循环中使用。它可能有旧数据
  • 您正在使用标量
    $test
    (它是
    %local\u hash
    中的一个键)作为另一个hash
您要做的是在比较哈希之后查看远程键
ident

根据您对问题的描述,您只需执行以下操作:

if ($local_hash{status} ne $remote_hash{status}){
  update( $remote_hash{ident}, $remote_hash{status} );
}
对于这两个哈希,您甚至不需要循环


如果您有一组散列,您可以在散列上进行循环,就像远程查询的结果一样。

这里有几个问题:

  • 您正在迭代一个键列表,并将每个键放入
    $test
    ,但您正在查看
    $\uuu
    ;该变量未在循环中使用。它可能有旧数据
  • 您正在使用标量
    $test
    (它是
    %local\u hash
    中的一个键)作为另一个hash
您要做的是在比较哈希之后查看远程键
ident

根据您对问题的描述,您只需执行以下操作:

if ($local_hash{status} ne $remote_hash{status}){
  update( $remote_hash{ident}, $remote_hash{status} );
}
对于这两个哈希,您甚至不需要循环



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

很难理解你想做什么;是否要确定除ident和status之外的键中的两个散列之间是否存在任何差异?或者仅仅是ident?我只想看看我在本地数据库中记录的唯一ident是否在远程散列中出现。若不匹配,则不管是否有任何其他信息匹配,禁用本地数据库上的记录。这是因为,如果远程数据库中的标识发生更改,则会在本地数据库中为其创建新记录。希望这是有意义的。请澄清一下,您显示的远程散列的转储是@remote\u hash\u list还是%remote\u hash的转储?您创建%remote\u散列只是为了这个问题涉及的查找,还是出于其他目的也需要它?(顺便说一句,在转储散列或数组时,如果转储对它们的引用,您会得到更好的输出-例如
转储程序(\%remote\u散列)
,这样它们就不会首先被展平到列表中。)转储文件是@remote\u hash\u列表,很难理解您想做什么;是否要确定是否存在