【问题标题】:compare one hash key with other hash's value将一个哈希键与另一个哈希值进行比较
【发布时间】:2013-06-12 16:57:05
【问题描述】:

你如何比较一个哈希的键和另一个哈希的值?这是我的哈希的输出。我只需要返回布尔输出。

(我的代码现在有点乱,所以请原谅我没有在这里发布。我只需要逻辑,我会尝试进一步整合它。)

    $VAR1 = {
      '5555' => [
                    '13570'
                  ]
    };
    $VAR1 = {
      '13570' => [
                   '[04/Jun/2013:15:06:13'
                 ]
            };

谢谢。

【问题讨论】:

  • defined $VAR1->{$VAR1->{'5555'}} 应该告诉您 $VAR1 中是否存在与 $VAR1 的键 '5555' 的值匹配的键 .... 对于 VAR1 的不同定义..... 8/
  • 我试过了,| if (定义 $hash1{$key2}) | , 这里 key2 指的是第二个哈希。

标签: perl hash


【解决方案1】:

$VAR1 被分配了两次。我想这是一个错字。你真的想检查一个哈希是否包含给定的键,尽管这个键与另一个哈希中的值相同 (eq)?

您可以使用exists,例如if (exists $hash{$key}) {...}definedexists的区别见What's the difference between exists and defined?

顺便说一句,当您使用{ } 声明匿名哈希和使用[ ] 声明匿名数组时,在获取实际内容之前需要取消引用;否则你只需使用引用(如 c 语言中的指针)。

【讨论】:

  • 不,这不是错字,这是使用 Data::Dumper 显示哈希的结果。 Data::Dumper 无权访问变量的实际名称,因此将它们都称为$VAR1
【解决方案2】:

让你失望的是你的哈希值不是实际的,而是指向单个的数组引用(如 Data::Dumper 输出中的 [ ... ] 所示) - 包含实际数据的元素数组。所以你需要取消引用它们并从结果数组中获取第一个元素:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my %hash1 = ('5555' => [ '13570' ]);
my %hash2 = ('13570' => [ '[04/Jun/2013:15:06:13' ]);

for (keys %hash1) {
  my $first_key = $_;
  my $second_key = $hash1{$first_key}[0];
  say "$first_key -> $second_key -> $hash2{$second_key}[0]";
}

输出:

5555 -> 13570 -> [04/Jun/2013:15:06:13

编辑:检查每个 %hash1 条目中的所有值并显示 %hash2 中每个条目的所有对应值的替代代码:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

my %hash1 = ('5555' => [ '13570', '8675309' ]);
my %hash2 = (
  '13570' => [ '[04/Jun/2013:15:06:13' ],
  8675309 => [ 'Jenny', 'I got your number' ],
);


for (keys %hash1) {
  my $first_key = $_;
  for my $second_key ( @{$hash1{$first_key}} ) {
    if (exists $hash2{$second_key}) {
      say "$first_key -> $second_key ->";
      say "\t$_" for @{$hash2{$second_key}};
    }
  } 
}

输出:

5555 -> 13570 ->
    [04/Jun/2013:15:06:13
5555 -> 8675309 ->
    Jenny
    I got your number

【讨论】:

  • 感谢 Dave 的回复,这是我一直在寻找的,但是正如您所知,第一个哈希可能包含多个值,因此需要 grep 才能存在。
  • @JohnRein 查看我为处理数组中的多个值而编辑的备用版本。
  • 哇,这太棒了。请忽略散列 2 中的第二个键,因为这两个散列之间不常见。我们只需要 firstkey 来比较 hash1 的值。
  • 你为什么不直接写for my $first_key (...){...}
【解决方案3】:

我知道如何将非加密值与加密值进行比较。不过我可能是错的。

如果是这样的话……

if HASH_VALUE(nonEncrypted) is equal to encryptedValue
    do something
else
    do something else

【讨论】:

  • 您能详细说明一下吗?
  • 这与问题无关
  • 这个问题是关于“散列”Perl 数据类型(在其他语言中称为“散列表”、“关联数组”或“字典”),而不是加密散列。
  • 问题是关于 Perl 数据结构的。这个答案是关于单向哈希函数。请删除它。
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 2012-08-18
  • 2019-02-03
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多