【问题标题】:Perl Hashes and regexPerl 哈希和正则表达式
【发布时间】:2012-10-24 18:46:30
【问题描述】:

我正在研究将句子拆分为单个单词的代码,然后根据哈希键搜索单词是否存在。我的代码返回 100% 相同的术语,在匹配之后,我用与匹配键对应的值标记句子中的单词。问题是代码标签术语,但随机值与我期望的不符。此外,在某些情况下,术语和哈希键相似但不是 100% 相同, 如何编写正则表达式以将我的术语与键匹配。 注意:我已经将散列键提取为它们的根形式。 我可以提供一些示例:如果句子中的术语是 Synergistic 或 anti-synergistic,并且我的哈希键是 Synerg,我如何将上述术语与 Synerg 匹配。

我的代码如下:

    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 

【问题讨论】:

    标签: perl


    【解决方案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 进行测试,因为我没有那个模块,而且它似乎没有必要。使用此模块可能还会在您的代码中引入其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2011-07-08
      • 2012-04-13
      • 1970-01-01
      • 2013-05-04
      • 2018-01-12
      • 2021-12-26
      相关资源
      最近更新 更多