在多维哈希perl中查找

时间:2014-11-13 14:28:48

标签: multidimensional-array hashtable lookup perl-data-structures

我实际上有这个数据结构(多维哈希表):

$VAR1 = {
      'cat' => {
               "félin" => '0.500000',
               'chat' => '0.600000'
             },
      'rabbit' => {
                  'lapin' => '0.600000'
                },
      'canteen' => {
                   "ménagère" => '0.400000',
                   'cantine' => '0.600000'
                 }
       };

我的目标是阅读一个标记化的文本,并为每个单词我需要找到翻译。对于我的令牌,我阅读了我的文本并创建了一个类似的数组:

##store each word to translate in a table
while(my $text_to_translate = <TEXTTOTRANSLATE>)
{       
    my @temp = split(/ /, $text_to_translate);
    push(@tokens, @temp);               
}

我的问题是找到最好的方式(并且最快)查找bidimensionnal哈希表并打印可能的翻译:

  

我爱我的猫[聊天;félin]和我的兔子[lapin]。

现在,我已经创建了这个循环,但它确实运行不好,我认为这不是最好的方法:

foreach my $source (sort keys %hash) {
    foreach my $target (keys %{ $hash{$source} }) {
            my $val = $source;
                ##loop into each tokens             
                foreach (@tokens) { 
                    my $actualWord = $_; 

                    if($val eq $actualWord){
                        print $actualWord."==>".$target."\n";
                    } 
                    else{
                            print $actualWord."\n";
                        next;
                    }                                   
                }
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我会做什么:

#!/usr/bin/env perl

use strict; use warnings;

my $hash = {
      'cat' => {
               "félin" => '0.500000',
               'chat' => '0.600000'
             },
      'rabbit' => {
                  'lapin' => '0.600000'
                },
      'canteen' => {
                   "ménagère" => '0.400000',
                   'cantine' => '0.600000'
                 }
       };

my $text = "I love my cat and my rabbit canteen !\n";

foreach my $word (split /\s/, $text) {
    print $word;
    exists $hash->{$word}
        and print "[" . join(";", keys %{ $hash->{$word} }) . "]";
    print " ";
}

print "\n";

输出:

I love my cat[chat;félin] and my rabbit[lapin] canteen[cantine;ménagère] !