【问题标题】:Perl - How to find the key of a hash if you know the value?Perl - 如果您知道值,如何找到哈希的键?
【发布时间】:2015-09-01 03:08:41
【问题描述】:

我要做的是在哈希中检索键值对的键,因为我从正在读取的文件中拥有的只是一个值。

代码产生如下内容:

12345welcome.html

这部分的代码是:

my %bugs;
my $bug;
open(FH, '-|', "lynx -dump '$queryurl'") or die "Could not lynx $queryurl: $!";
while (<FH>)
{
    if (/<bz:id[^>]*>([^<]*)</)
    {
        $bug = $1;
    }
    if (/<bz:url[^>]*>([^<]*)</)
    {
        my $url = $1;
        $bugs{$url} = $bug;
        $bug = undef;
    }
}
close(FH);

# for debugging purposes
foreach my $bug (keys %bugs)
{
    print "$bugs{$bug} $bug\n";
}
exit;

然后,在名为 bad.txt 的文件中的其他位置,我得到如下输出:

Documents that failed: daerror 6 0 6 welcome.html

读取这个文件的代码是:

my $badfile = "$dir/bad.txt";
open(FH, "<$badfile") || die "Can not open $badfile: $!";
# ignore first line
<FH>;
while (<FH>)
{
    chomp;
    if (!/^([^ ]+) [^ ]+ [^ ]+ [^ ]+ ([^ ]+) [^ ]+$/)
    {
        die "Invalid line $_ in $badfile\n";
    }
    my $type = $1;
    my $testdoc = $2;
}

但我已经使用正则表达式从中提取了文件名。

【问题讨论】:

  • [^ ]+ 也可以写成 \S+ 你也可以使用m 并将 $type 和 $testdoc 设置在一行上。 my($type,$testdoc) = $_ =~ m/^(\S+) \S+ \S+ \S+ (\S+) \S+$/; die "Invalid line $_ in $badfiles\n" unless defined $type &amp;&amp; defined $testdoc;.

标签: perl hash


【解决方案1】:

您可以使用 reverse 运算符制作原始哈希的反向副本,然后进行“正常”查找(仅当原始哈希中的值唯一时才能正常工作)。

有关此主题的更多信息,包括在 perlfaq4 处理重复值:How do I look up a hash element by value

【讨论】:

  • 感谢您的链接,不过在我接受任何答案之前需要先查看它!
【解决方案2】:
my ($key) = grep{ $bugs{$_} eq '*value*' } keys %bugs;
print $key;

【讨论】:

    【解决方案3】:

    如果您没有将 %bugs 哈希用于其他任何内容,只需修改:

    $bugs{$url} = $bug;
    

    到:

    $bugs{$bug} = $url;
    

    然后,您将获得一个哈希,其中包含满足您查询需求的正确键。

    【讨论】:

    • 或者创建一个新的散列,并处理重复值,使用数组。
    猜你喜欢
    • 2011-07-12
    • 2010-11-09
    • 2011-08-27
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多