2016-07-25 120 views
0

我有一个Perl程序代码,用于从哈希中提取描述字符串。测试一个字符串是否包含另一个字中的任何字

我有我的变量$ui等于变量$uniqueID,但我要的是如果$ui包含可变$unqiueID任何话返回true。但是=~不起作用。

有没有这样做的巧妙方法?

sub getDescription { 

    my $uniqueID = shift; 
    my $retval; 
    my $ui; 

    foreach my $key (keys %HASHLIST) { 

     foreach $ui (@{ $HASHLIST{$key}->{uniqueID} }) { 

      if ($ui eq $uniqueID) { 
       $retval = $HASHLIST{$key}->{description}; 
       last; 
      } 
     } 

     last if $retval; 
    } 

    return $retval; 
} 
+1

你的代码看没什么问题。测试你的代码,用'print'替换'$ retval = $ HASHLIST {$ key} - > {description};''''''ui \ t $ uniqueID“;' – Arijit

+1

同时检查你的'%HASHLIST'是否是它们。代码没有'%HASHLIST'并显示你的'=〜'行 – Arijit

+2

你是什么意思“=〜不工作”?你有没有试过'if($ ui =〜/ $ uniqueID /){...}'? – Mikesname

回答

2

一个简单的方法来测试,如果一个标量变量包含另一个是:

if ($ui =~ /$uniqueID/) { 
    ... 
} 

(正如@Markus Laire指出,你也可以使用/\b$uniqueID\b/防止局部字匹配。)

+0

OP要测试*“$ ui是否包含变量$ unqiueID中的任何单词”*。这将测试它是否包含'$ uniqueID'中的整个字符串。 – Borodin

+1

@Borodin我认为这个问题还不清楚,但是OP要求我发布这个答案,我不得不承认。 – Mikesname

+1

如果'$ uniqueID'具有正则表达式元字符,则使用'/ \ Q $ uniqueID \ E /'来防止出现假阳性和假阴性结果。 – mob

0

你目的不明确,但听起来像$uniqueID是一个单词列表,并且您希望%HASHLIST的第一个条目的uniqueID匹配其中任何一个单词

这会为你做的,但我必须说,你的数据结构并不适合这份工作

sub getDescription { 

    my ($uniqueID) = @_; 
    my %wanted = map { $_ => 1 } split ' ', $uniqueID; 

    for my $ui (values %HASHLIST) { 
     my @ids = @{ $item->{uniqueID} }; 
     return $item->{description} if @wanted{@ids}; 
    } 

    return $retval; 
} 
相关问题