1

я на самом деле имеют эту структуру данных (многомерный хэш-таблицы):поиска в многомерном хэш Perl

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

Моя цель состоит в том, чтобы читать токенизированный текст, и для каждого слова мне нужно найти перевод (s). Для моих лексем, я прочитал мой текст и создать массив так:

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

Моя проблема заключается, чтобы найти лучший способ (и самый быстрый) для поиска в bidimensionnal хэш-таблицы и печать возможный вариант перевода (s):

Я люблю свою кошку [chat; félin] и мой кролик [lapin].

На данный момент у меня было создать эту петлю, но он did'nt работать хорошо, и я думаю, что это не самый лучший способ:

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

Что бы я сделал:

#!/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] ! 
+0

Он хорошо работает с Hash, который вы создаете выше цикла; но когда я использую этот код для автоматического заполнения моего хеша, он не работает. Это мой код: 'my% hash; в то время как (мой $ текст = ) { \t если ($ текст = ~ /(^(.+) \ | \ | \ | \ (+.) | \ | \ | (. +) $) /) \t { \t my $ sourceWord = $ 2; \t \t my $ targetWord = $ 3; \t \t my $ freq = $ 4; \t \t \t \t $ hash {$ sourceWord} {$ targetWord} = $ freq; \t \t} } ' –

+0

Поскольку мой сценарий использует' ссылки' perl. См. Http://pastebin.com/AEcsdsgM –

+0

См. Http://perldoc.perl.org/perlref.html и http://perldoc.perl.org/perlreftut.html –

Смежные вопросы