2012-10-08 8 views
0

파일을 읽습니다. 나는 나머지 라인의 모든 번호를 1로 해쉬하는 키의 첫 번째 숫자를 줄 수있는 해쉬를 원한다.Perl 해시 출력 해시

Dumper가 올바르게 인쇄하기 때문에 해시를 올바르게 추가한다고 생각한다. . 그러나 "$ first $ secondID \ n"이 (가) 출력되지 않습니다.

while (<FILE>) { 

    chomp $_; 

    if (/(\d+)\t(.+)/) { 

     $firstNum = $1; 
     @seconds = split(/\,/,$2); 

     foreach $following (@seconds) { 

      $Pairs->{$firstNum}{$following} = 1; 
     } 

     foreach $first (sort {$a <=> $b} keys %Pairs) { 

      print "$first\n"; 
      %second = {$Pairs{$first}}; 

      foreach $secondID (sort {$a <=> $b} keys %second) { 

       print "$first $secondID\n"; 
      } 
     } 
     print Dumper($Pairs); 
    } 
    else { 

     print "ERROR\n"; 
    } 
} 

은 나중에, 정의 $ 여부 쌍 {$의 NUM1} {$의 NUM2}을보고 내가 찾아하고 싶은 한 쌍의 숫자를 주어진. 쓸 것입니까

if(defined $Pairs{$num1}{$num2}) 

먼저 첫 번째 키를 확인해야합니까?

%second = %{$Pairs->{$first}}; 
+0

'% 초 = {쌍 {첫번째 $}} : 더시길를하기 전에

이 프로그램은 의도 한대로 작동하고, 명령 줄 매개 변수로 파일 이름을 기대 '쌍 ' – toolic

+0

게시시 실수로 삭제되었습니다. 나는 변수의 이름을 바꾸고 있었다. 문제가 남아 있습니다. – user1645240

답변

0

당신은 오류의 몇 가지있다 : 다음 두 번째 키를

if (defined $Pairs{$num1}) { 

    $temp = $Pairs{$num1}; 
    if (defined $temp{$num2}) { 

     print "true\n; 
    } 
} 
0
my %hash; 
while (<>) { 
    my @numbers = split /\D+/; 
    my $key  = shift @numbers; 
    @{$hash{$key}}{ @numbers } = (1) x @numbers; 
} 


# test it this way... 
if ($hash{ $num1 }{ $num2 }) { 

} 
0

사용을 확인합니다. 먼저 %Pairs 또는 $Pairs을 사용하여 해시를 저장하는지 여부를 잘 모르는 경우, %second = {$Pairs{$first}}이 있고 해시에 대한 해시 참조를 %second에 할당하려고합니다. 아마도 my %second = %{ $Pairs{$first} }을 원할 것입니다.

당신은 항상use strict 모든 펄 프로그램의 시작 use warningsmy를 사용하여 처음 사용의 시점에서 모든 변수를 선언해야합니다. 이것은 쉽게 간과 할 수있는 간단한 실수를 알려주고이 프로그램에서 %Pairs$Pairs을 모두 사용하고 해시에 단일 값 (해시 참조)을 할당하려는 시도를 나타냅니다.

전체 해시를 복사하는 대신 $seconds에 참조를 저장해야합니다. 그런 다음 다음 for 루프에서 역 참조 할 수 있습니다.

경험 많은 Perl 프로그래머는 로컬 (my) 변수에 소문자 + 밑줄을 사용하고 패키지 및 클래스 이름에 대문자를 예약 해 주셔서 감사합니다. `오타처럼 보이는 없습니다

use strict; 
use warnings; 

my %pairs; 

while (<>) { 

    unless (/(\d+)\s+(.+)/) { 
    print "ERROR\n"; 
    next; 
    } 

    my $first_num = $1; 
    my @seconds = split /,/, $2; 

    foreach my $following (@seconds) { 
    $pairs{$first_num}{$following} = 1; 
    } 

    foreach my $first (sort { $a <=> $b } keys %pairs) { 
    print "$first\n"; 
    my $second = $pairs{$first}; 
    foreach my $second_id (sort { $a <=> $b } keys %$second) { 
     print "$first $second_id\n"; 
    } 
    } 

}