2012-10-24 47 views
0

我正在研究將句子拆分爲單個單詞的代碼,然後使用散列鍵搜索單詞以查找它們的存在。我的代碼返回100%相同的條件,匹配後,我使用與匹配鍵相對應的值標記句子中的單詞。問題是代碼標籤術語,但隨機值不符合我的預期。此外,在某些情況下,術語和散列鍵相似但不是100%相同,我如何編寫正則表達式來匹配我的術語和鍵。 注意:我已經將哈希鍵設置爲它們的根形式。我提供了一些例子:如果句子中的術語是協同或反協同的,而我的哈希鍵是Synerg,那麼我怎樣才能將上述術語與Synerg相匹配。Perl哈希和正則表達式

我的代碼如下:

open IN, "C:\\Users\\Desktop\\TM\\clean_cells.txt" or die "import file absent"; 
    my %hash=(); 
    use Tie::IxHash; 
    tie %hash => "Tie::IxHash"; 
    while(<IN>) 
    { 
    chomp $_; 
    $line=lc $_; 
    @Organs=split/\t/, $line; 
    $hash{$Organs[0]}=$Organs[1]; 
    } 

    $Sentence="Lymphoma is Lymph Heart and Lung"; 
    @list=split/ /,$Sentence; 

    @array=(); 
foreach $term(@list) 
{ 
chomp $term; 
    for $keys(keys %hash) 
    { 
    if($hash{$term}) 
    { 
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>"; 
    push(@array, $cell); 
    } 
    elsif($term=~m/\b\Q$keys(\w+)\E\b/) 
    { 
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>"; 
    push(@array, $cell);   
    } 
    elsif($term=~m/\b\Q(\w+)$keys\E\b/) 
    { 
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>"; 
    push(@array, $cell);   
    } 
    elsif($term=~m/\b\Q(\w+)$keys(\w+)\E\b/) 
    { 
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>"; 
    push(@array, $cell);   
    } 
} 
} 
print @array; 

for example: hash looks like this: %hash={ 
             TF1 => Lymph 
           Thoracic_duct => Lymph 
            SK-MEL-1 => Lymph 
             Brain => Brain 
            Cerebellum => Brain 
             }; 
    So if the term TF1 is found it should be substituted to Lymph TF1 /Lymph 

回答

1

我發現,是防止工作的代碼兩個大問題:

  • 你快把鑰匙給您的散列小寫,但你是不是做 相同的條款$Sentence。因此,來自 $Sentence的大寫字將永遠不匹配。
  • \Q...\E修飾符禁用正則表達式元字符。雖然在插入變量時這樣做通常很好,但不能在其中使用像(\w+)這樣的表達式 - 它將查找文字字符(\w+)。那些正則表達式需要像這樣重寫:m/\b\Q$keys\E(\w+)\b/

還有其他的設計問題與您的代碼,以及:

  1. 您使用所有的地方未聲明的全局變量。您應該用my聲明所有變量。始終打開use strict; use warnings;,這會強制您正確執行此操作。
  2. 似乎沒有任何理由Tie::IxHash,這會導致您的哈希被排序。您不要在代碼中以任何方式使用此順序。輸出按@list排序。我會放棄這個不必要的模塊。
  3. 您的if/elsif陳述是多餘的。 if($term=~m/\b\Q(\w*)$keys(\w*)\E\b/)將完成相同的事情,所有他們合併。請注意,我將\w+替換爲\w*。這允許組之前和之後匹配零個或多個字符而不是一個或多個字符。

注:我沒有打擾測試與Tie::IxHash,因爲我沒有這樣的模塊,它似乎沒有必要。有可能使用這個模塊也會在代碼中引入其他問題。