2011-06-21 50 views
6

我想要做的是檢索一個鍵值對中的一個哈希鍵,因爲我從我正在閱讀的文件中獲得的是一個值。Perl - 如何知道值的哈希鍵?

的代碼產生這樣的:

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

,但我已經有使用正則表達式從這個提取的文件名。

+0

[+] +也可以寫成\ S +您也可以使用'm'並在一行中設置$ type和$ testdoc。 my($ type,$ testdoc)= $ _ =〜m/^(\ S +)\ S + \ S + \ S +(\ S +)\ S + $ /除非定義了$ type && defined $ testdoc;',否則在「$ badfiles \ n中無效行$ _」。 – mrk

回答

3

如果你不使用%bugs哈希爲別的,只是修改:

$bugs{$url} = $bug; 

到:

$bugs{$bug} = $url; 

然後你將得到一個散列,其中包含正確的鍵來滿足你的查詢需求。

+0

或者創建一個新的散列,並處理重複值,使用一個數組。 – TLP

+0

謝謝,會給它一個鏡頭。 – martincarlin87

9

您可以使用reverse運算符製作原始散列的倒置副本,然後進行「正常」查找(只有在原始散列中的值唯一時才能正常工作)。

更多關於這個話題包括perlfaq4處理重複值:How do I look up a hash element by value

+0

感謝您的鏈接,但在我接受任何答案之前需要查看它! – martincarlin87

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