2012-09-14 25 views
2

我想匹配散列的散列的鍵與正則表達式。散列散列的智能匹配運算符

$line=" Cluster(A,B):A(T) M(S)"; 
$reg="Cluster"; 
my ($cluster, $characters) = split (/:/,$line); 
$HoH{$cluster}={split /[()]+/,$characters } ; 
foreach $value(keys %HoH){ 
    foreach $characters (keys %{$HoH{$cluster}}){ 
     print "$value:$characters\n" if /$reg/ ~~ %HoH; 
    } 
} 

現在的輸出是:

羣集(A,B):甲

羣集(A,B):M

此代碼是正常工作與該樣品的數據,但不與真實的數據!我的數據更復雜,但結構是我想知道是否有一些其他的方法可以做到這

+2

嘗試描述你需要實現而不依賴於smartmatch操作符。向我們展示一個散列哈希的例子,您可以指出您嘗試匹配哪些鍵。 – pmakholm

+0

已更新問題 – shaq

+0

如果只有外部散列中的一個鍵匹配/ Cluster /,則更新後的代碼將打印* all *條目。這是打算嗎? – pmakholm

回答

1

同一也許你只想

print "something\n" if exists $HoH{regexp} 

也許

print "something\n" if grep /regexp/, keys %HoH 

但如果沒有這些都是正確的,那麼你需要更好地解釋你需要什麼,並給出一些例子

+0

根據perl 5.16.0附帶的文檔,後者的條件應該相當於'/ regexp/~~%HoH'。 – pmakholm

+0

問題已更新 – shaq

1

這是根據文件記錄,我不確切問題是什麼,但智能墊ch運算符可以更好地引用數組和哈希值。所以你可能有更好的運氣

/$reg/ ~~ \%Hoh 
1

SmartMatch目前是複雜,笨拙和令人驚訝。不要使用它,至少現在不用。 Perl的主要開發人員正在談論,要麼大大簡化它,要麼完全刪除它。無論哪種方式,它不會做你未來要做的事情,所以現在不要依賴它。

無論如何,更明確地表達你想要的是更好的。

0

最有可能的,你的錯誤是在這裏:

foreach $characters (keys %{$HoH{$cluster}}) { 

應閱讀

foreach $characters (keys %{$HoH{$value}}) { 

。大概。