2012-09-14 2 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 있지만, 실제 데이터가 아닙니다! 아마도 당신은 그냥

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

아니면

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

을 원하지만 내 데이터는 더 복잡하지만 구조는 내가이

+2

smartmatch 운영자에게 의존하지 않고 달성해야 할 것을 설명하십시오. 일치시키려는 키를 가리키는 해쉬 해시 예제를 보여주세요. – pmakholm

+0

질문이 업데이트 됨 – shaq

+0

바깥 쪽 해시의 키 중 하나만/Cluster /와 일치하면 업데이트 된 코드가 * all * 항목을 출력합니다. 그게 의도 된거야? – pmakholm

답변

1

을 할 수있는 다른 방법이 있다면 궁금 해서요 같은 경우 어느 쪽도 없습니다 이러한 것들이 정확하다면 필요한 것을 더 잘 설명하고 몇 가지 예를 들어야합니다.

+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}}) { 

을 읽어야합니다. 아마.

관련 문제