Perl - 如果知道值,如何找到哈希的键?

mar*_*n87 6 perl hash

我想要做的是检索哈希中键值对的键,因为我所读取的文件中的所有键都是值.

代码产生这样的东西:

12345 welcome.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;
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*dan 10

您可以使用reverse运算符生成原始哈希的反转副本,然后进行"正常"查找(仅当原始哈希中的值是唯一的时才能正常工作).

有关此主题的更多信息,包括在perlfaq4处理重复值:如何按值查找哈希元素


小智 6

my ($key) = grep{ $bugs{$_} eq '*value*' } keys %bugs;
print $key;
Run Code Online (Sandbox Code Playgroud)


Fra*_*o R 3

如果您不将%bugs哈希用于其他用途,只需修改:

$bugs{$url} = $bug;
Run Code Online (Sandbox Code Playgroud)

到:

$bugs{$bug} = $url;
Run Code Online (Sandbox Code Playgroud)

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