2016-07-25 139 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; 
} 
相關問題