2013-02-26 3 views
2

나는 지난주에 Perl을 배우기 시작했습니다.두 연관 배열 비교

'tokens'가 포함 된 파일의 연관 배열이 있습니다. 숫자가 많습니다. '토큰 (tokens)'이 포함 된 SQL 데이터베이스의 다른 연관 배열이 있습니다.

파일의 토큰이 데이터베이스에 없는지보고 싶습니다. 그러나 내가하는 일은 효과가없는 것 같아서 혼란 스럽다는 결론에 도달했습니다.

은 내가 완전히는 연관 배열을 이해 아직 확실하지 않다하지만이 파일의 해시 내 코드 조각입니다 :

while($row = <FILE>){ 
    if($row =~ /^000\E/){ 
     @tmp=split(/\s+/,$row);  
     if($tmp[1] ne "Unassigned"){ 
      $tokenfile{$tmp[0]} = $tmp[1] . " " . $tmp[2]; 
     } 
    } 
} 

$tmp[1] + $tmp[2]

제 1 및 제 2 이름입니다. 나는 나중에 그들이 서로 동등한지를보기 위해 이름을 비교한다. 그러나 나는 $tmp[0] - 토큰을 비교하고 싶다. 이것은 SQL 해시입니다.

while(@rows = $sth->fetchrow_array){ 
    ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwnam("\L$rows[1]\E"); 
    $gcos =~ s/,.*//; 
    if(!defined($gcos)){ 
     $missing++; 
     $tokendb{$rows[0]} = $rows[1]; 
    } 
    else{ 
     $tokendb{$rows[0]} = $gcos; 
    } 
} 

$rows[0]은 토큰입니다.

는 나는 이와 같은 두 foreach는 루프를 사용하는 것이 가정 :

foreach $token (keys(%tokendb)) { 
    foreach $token2(keys(%tokenfile)){ 
     if($token ne $token2){ 
      print "$token2 NOT IN DATABASE\n"; 
     } 
    } 
} 

를하지만 나에게 데이터베이스에 여전히 값의 많은의 결과를 제공합니다.

이것이 작동하지 않는 이유에 대한 몇 가지 힌트가 좋을 것 같습니다. 나는 그것이 매우 간단하지만 내 두뇌가 오늘 그렇게 잘 작동하지 않는다는 것을 알기 때문에 매우 실망 스럽다 (나의 21 번째 생일 임에도 불구하고 |).

+0

'/^000 \ E /'에서'\ E' 란 무엇을 의미합니까? 이 이스케이프 시퀀스는'\ Q ... \ E'와 같은 다른 이스케이프 시퀀스를 종료하는 데 사용됩니다. – TLP

+0

디버깅 목적으로 이것을 사용하십시오'Use Data :: Dumper; $ 데이터 :: 덤퍼 :: Useqq = 1; Dumper \ % tokendb, \ % tokenfile;'을 출력하십시오. 아니면 너무 지저분 해지면 루프의 값을 출력하십시오 :'print Dumper ''$ token 'ne'$ token2 ' " – TLP

+1

경고! 경고! 여전히 "연관 배열 (associative arrays)"이라고 부르는 소스에서 Perl을 배우는 경우, 아마도 15 년이 넘은 소스로부터 학습하게됩니다. –

답변

1

해시를 반복하고 모든 키를 개별적으로 테스트하여 그 중 하나가 목표 값인지 여부를 확인하는 경우 해시 기능을 활용하지 않습니다. 조회.

foreach $token (keys(%tokenfile)) { 
    unless (exists $tokendb{$token}) { 
    print "$token NOT IN DATABASE\n"; 
    } 
} 

과 같이 시도해보세요.

3
foreach $token (keys(%tokenfile)) { 
    if (! exists $tokendb{$token}) { 
    print "$token NOT IN DATABASE\n"; 
    } 
} 

키가 존재하더라도 다른 모든 키와 일치하지 않기 때문에 중첩 루프가 실패했습니다. 중첩 루프와 함께 작업을 수행하려면, 그것이 있어야 :

물론
foreach $token (keys(%tokenfile)) { 
    $found = 0; 
    foreach $token2 (keys(%tokendb)) { 
    if ($token eq $token2) { 
     $found = 1; 
     last; 
    } 
    } 
    if (!found) { 
    print "$token NOT IN DATABASE\n"; 
    } 
} 

, 이런 식으로 쓸 이유가 없다, 이것은 당신이 당신의 논리가 실패 방법을 이해하는 데 도움이되는 단지이다.

+1

이 경우에는 해시 키를 반복하는 것이 중복된다는 것을 지적해야합니다. 또한 나는'found '와'break'가 아니라'found found'와'last'를 의미한다고 가정합니다. – TLP

+0

최근에 PHP/자바 스크립트가 너무 많습니다. – Barmar

+0

대단합니다. – TLP