2

hash のハッシュのキーを regexpと一致させたい。

$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

クラスタ(A、B):M

このコードは、このサンプル データでは正常に動作しますが、実際のデータでは動作しません!! 私のデータはより複雑ですが、構造は同じですこれを行う他の方法があるかどうか疑問に思っていました

4

4 に答える 4

1

SmartMatchは現在、複雑で扱いにくく、驚くべきものです。少なくとも今は使用しないでください。perlの主な開発者による話があり、それを大幅に単純化するか、完全に削除するかのどちらかです。いずれにせよ、それはあなたが将来それをするように頼んでいることをしないので、今それをすることに依存しないでください。

とにかく、あなたが欲しいものについてより明確にすることはより良いことです。

于 2012-09-14T14:51:36.787 に答える
1

おそらくあなたはただ欲しい

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

または多分

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

しかし、これらのどちらも正しくない場合は、必要なものをよりよく説明し、いくつかの例を示す必要があります

于 2012-09-14T12:03:25.730 に答える
1

これは文書化されておらず、問題が何であるかを正確に把握していませんが、スマートマッチ演算子は配列とハッシュへの参照でより適切に機能します. だからあなたはより良い運を持っているかもしれません

/$reg/ ~~ \%Hoh
于 2012-09-14T14:25:36.353 に答える
0

おそらく、あなたのバグはここにあります:

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

どちらを読むべきか

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

. おそらく。

于 2012-09-15T03:53:53.440 に答える