Perl-как найти ключ хэша, если вы знаете значение?

то, что я пытаюсь сделать, это получить ключ пары значений ключа в хэше, потому что все, что у меня есть из файла, в котором я читаю, это значение.

код выдает что-то вроде этого:

12345 welcome.html

код для этой части:

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

# for debugging purposes
foreach my $bug (keys %bugs)
{
    print "$bugs{$bug} $bugn";
}
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 $badfilen";
    }
    my $type = ;
    my $testdoc = ;
}

но у меня уже есть имя файла, извлеченное из этого с помощью регулярного выражения.

3 ответов


Если вы не используете %bugs хэш для чего-либо еще, просто измените:

$bugs{$url} = $bug;

в:

$bugs{$bug} = $url;

тогда у вас будет хэш с правильными ключами для ваших запросов.


вы можете сделать перевернутую копию исходного хэша с помощью reverse оператор, а затем сделайте" нормальный " поиск (будет работать правильно, только если значения в исходном хэше уникальны).

подробнее по этой теме, включая обработку повторяющихся значений в perlfaq4:как найти элемент хэша по значению


my ($key) = grep{ $bugs{$_} eq '*value*' } keys %bugs;
print $key;