2011-06-21 6 views
6

Co próbuję zrobić, to pobrać klucz pary klucz-wartość w haszyszu, ponieważ wszystko, co mam z pliku, w którym czytam, jest wartością.Perl - Jak znaleźć klucz hasha, jeśli znasz wartość?

Kod produkuje coś takiego:

12345welcome.html

Kod dla tej części brzmi:

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; 

Następnie gdzieś w pliku o nazwie bad.txt mam wyjścia jak:

Documents that failed: daerror 6 0 6 welcome.html

Kod do czytania tego pliku jest:

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; 
} 

Ale mam już nazwę pliku wyodrębnione z tego za pomocą wyrażenia regularnego.

+0

[^] + można również zapisać jako \ S + Można również użyć 'm' i ustawić $ typ i $ testdoc wszystko w jednym wierszu. 'my ($ type, $ testdoc) = $ _ = ~ m/^ (\ S +) \ S + \ S + \ S + (\ S +) \ S + $ /; die "Nieprawidłowa linia $ _ w $ badfiles \ n", chyba że zdefiniowano $ type && defined $ testdoc; '. – mrk

Odpowiedz

3

Jeśli nie używasz %bugs hash na nic innego, tylko zmodyfikować:

$bugs{$url} = $bug; 

do:

$bugs{$bug} = $url; 

Następnie będziesz mieć skrót z odpowiednimi kluczami do potrzeb zapytania.

+0

Lub utwórz nowy skrót, a do obsługi duplikatów wartości użyj tablicy. – TLP

+0

Dzięki, zrobię to. – martincarlin87

9

Możesz wykonać odwróconą kopię oryginalnego skrótu za pomocą operatora reverse, a następnie wykonać "normalne" wyszukiwanie (działałoby poprawnie tylko wtedy, gdy wartości w oryginalnym krzyżyku są unikatowe).

Więcej na ten temat w tym obsługę zduplikowanych wartości w perlfaq4: How do I look up a hash element by value

+0

dzięki za link, zajrzyj do niego zanim przyjmuję jakieś odpowiedzi! – martincarlin87

4
my ($key) = grep{ $bugs{$_} eq '*value*' } keys %bugs; 
print $key; 
Powiązane problemy