【问题标题】:Perl: Find first hash key of one hash that's also in another hashPerl:查找一个散列的第一个散列键,该散列也在另一个散列中
【发布时间】:2016-05-04 03:21:08
【问题描述】:

我写了这个简单的子,它可以正常工作:

sub search_dispatch_table
{
    my ($href1, $href2) = @_;

    foreach my $key (keys %$href1)
    {
        return $key if exists $href2->{$key};
    }
    return undef;
}

我只想返回href1 的第一个键,它也存在于href2 中。

有没有更好的方法?

【问题讨论】:

  • 您的意思是“第一个”,如“任何键都可以,只要找到一个就停止”还是“按某种顺序排序时的第一个键”? (您的代码是前者,但只是想确定一下。)
  • 您的代码目前似乎可以运行,并且您正在寻求改进它。一般来说,这些问题对于本网站来说过于固执己见,但您可能会在CodeReview.SE 找到更好的运气。记得阅读their requirements,因为他们比这个网站更严格。
  • 您没有指定您希望用来评估哪种解决方案更好的标准。
  • 另外,在上下文中可能有什么更好的——这是做什么用的,它是如何使用的?
  • 我的意思是首先任何键都可以,因为我知道两个散列中的键都是唯一的。 “更好”是指是否有任何 CPAN 模块可以做到这一点?谢谢

标签: perl hash


【解决方案1】:

您没有指定您希望用来评估哪种解决方案更好的标准。

假设您的意思是“更快”,您可以通过使用 each 而不是 keys 来加快最佳情况,但仅此而已。

sub search_dispatch_table {
    my ($href1, $href2) = @_;

    while (my ($key) = each(%$href1)) {
        if (exists($href2->{$key})) {
           keys(%$href1);  # Reset iterator.
           return $key;
        }
    }

    return undef;
}

【讨论】:

  • # Reset iterator 不错!我从来没有这样使用过钥匙,你暗示钥匙对%$href1有什么作用,是这样吗?
  • 试试perl -E'my %h = map { $_= > 1 } qw( a b c d ); each(%h) for 1..2; say keys(%h);' 看到问题了吗?
猜你喜欢
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2014-07-27
  • 2013-07-08
  • 2011-05-08
  • 2012-10-25
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多