2016-08-29 21 views
2
#!/usr/bin/perl -C0 
use strict; 
use warnings; 
use DBI; 

sub agg_verification 
{ 
my ($list,$tblname,$values); 
my $res1=undef; 
my $res2=undef; 

    #First DB Connection****** 
    my $connstr = "ENG=xxx;CommLinks=tcpip{port=xxx};UID=xxx;PWD=xxx"; 
    my $dbh = DBI->connect("DBI:SQLAnywhere:$connstr", '', '', {AutoCommit => 0}) or warn $DBI::errstr; 
    my $stmt="select col1||':'||col3 as a, col2||'('||col3||')' as b from table where col1 like '%xxxx:((15))%'"; #making 'a' as primary key for fetchall_hashref() later. 
    my $sth=$dbh->prepare($stmt) or warn $DBI::errstr; 
    $sth->execute() or warn $DBI::errstr; 

    #Second DB Connection****** 
    my $connstr1 = "ENG=xxx;CommLinks=tcpip{port=xxx};UID=xxx;PWD=xxx"; 
    my $dbh1 = DBI->connect("DBI:SQLAnywhere:$connstr1", '', '', {AutoCommit => 0}) or warn $DBI::errstr; 
    my ($sth1,$stmt1,$stmt2); 
    #creating, opening and writing the result in a file 
     open my $fh, '+>>', "/eniq/home/dcuser/output.txt" or warn "Cannot open output.txt: $!"; 

     my $res = $sth->fetchall_hashref('a'); 

     foreach my $key(sort keys %$res) { 
      my @col1 = $res->{$key}->{'a'}; 
      $list=\@col1; 
       foreach my $item(@$list) 
        { 
         my @values=${$res}{$item}->{'b'}; 
         $values=\@values; 
         my @tblname=$item=~ m/[(\w*)(\:)](DC\w*)/; #trimming table name 
         $tblname =\@tblname; 
         #print $fh "TABLENAME :@$tblname\n"; 

          foreach my $raw(@$tblname) #Extracting _RAW data********************* 
          { 
           $raw.="_RAW"; 
           chomp($raw); 
           $stmt1 = "select @$values from $raw"; 
           $stmt2 = ""; 
           $sth1=$dbh1->prepare($stmt1) or warn $DBI::errstr; 
           $sth1->execute() or warn $DBI::errstr; 
           my $max_rows1 = 5_000; 
           $res1 = $sth1->fetchall_arrayref(undef,$max_rows1); 

               } 
          foreach my $day(@$tblname) #Extracting _DAY DATA******************** 
          { 
           $day =~ s/(\_RAW)//; 
           chomp($day); 
           $day .="_DAY"; 
           $stmt2 = "select @$values from $day"; 
           $sth1=$dbh1->prepare($stmt2) or warn $DBI::errstr; 
           $sth1->execute() or warn $DBI::errstr; 
           my $max_rows = 5_000; 
           $res2 = $sth1->fetchall_arrayref(undef,$max_rows);        
               } 

           if(@$res1 == @$res2) 
           { 
            print $fh "PASS at @$values\n"; 
               } 
           else 
           { 
            print $fh "FAIL at @$values\n"; 
               } 
                } 
                 } 


    close $fh or warn "Couldn't close file properly"; 
     $sth1->finish(); 
     $sth->finish(); 
     $dbh1->disconnect; 
     $dbh->disconnect; 
} 
agg_verification(); 

얘들 아, 내가 $ res1과 $ res2에 오는 숫자 값을 비교하고 싶지만 통과하거나 실패한 결과를 얻지 못하고있다. 내 출력은 변경 사항과 관계없이 모두 "통과"합니다. 위의 코드에서 외부 CPAN 라이브러리를 사용하지 않고 배열 참조의 값을 비교하는 방법을 제안하십시오. 라이브러리를 업데이트하거나 추가 할 수있는 권한이 없습니다.perl에서 Array 참조의 값을 비교하는 방법은 무엇입니까?

+0

을 그것은 단지 다시'내 $ 항목 (@의 $ 목록)'수를 foreach는 역 참조에 col1' = \ @ $리스트'배열에 대한 참조를 복사하는 이상한 접근법 그 뒤에있는 생각을 설명해 주시겠습니까? 또한'my ($ list, $ tblname, $ values)'가 너무 일찍 선언 될 이유가없는 것 같습니다. 서브 루틴 전체에서 사용할 필요가 없습니다. – Borodin

+0

@ Borodin 귀하의 제안에 감사드립니다. 그러나이 논리는 약 백만 행에 대해 구현되어야합니다. 그래서 더 안전한 측면을 위해 값을 저장하기 위해 항상 참조를 사용하는 것입니다. 그리고 "my ($ list, $ tblname, $ values)"변수는 다른 서브 루틴에서 사용해야합니다. 다른 제안은 환영합니다. –

답변

2

내 출력이 모두 "통과"되는 관계없이 때문에 단지 모두 해제 참조 배열의 요소 수를 비교 한 아래 조건입니다 변경

의. 당신이 (당신의 질문에 따라 수치입니다) 두 배열 참조의 내용을 비교하려면

if(@$res1 == @$res2) 

당신은 위의 경우에

#!/usr/bin/perl 
use strict; 
use warnings; 
use Test::More 'no_plan'; 
my $res1 = [5,8,10,12]; 
my $res2 = [5,8,10,12]; 
is_deeply($res1, $res2, 'Compare arrayref'); 

출력을 수행 할 수 있습니다

[email protected]:~/Desktop$ perl test.pl 
ok 1 - Compare arrayref 
1..1 

동일하지 않은 경우 :

my $res1 = [5,8,10,12]; 
my $res2 = [3,8,10,12]; 
난 당신이 arrayrefs을 비교하는 방법, 당신이 (다른 방법 질문 아래에 대답 만 참조 할 수 있습니다에 한 가지 방법을 보여

[email protected]:~/Desktop$ perl test.pl 
not ok 1 - Compare arrayref 
# Failed test 'Compare arrayref' 
# at test.pl line 7. 
#  Structures begin differing at: 
#   $got->[0] = '5' 
#  $expected->[0] = '3' 
1..1 
# Looks like you failed 1 test of 1. 

쉽게하는 값을 확인할 수 363,210

그런 다음 아래에 설명 얻을 것이다 출력은 불평등이었다 있는지 확인하십시오 당신이 당신의 배열이 먼저 비교를 할) 참조 해제 :

,363,210
모든 모듈을 사용하지 않고

솔루션

#!/usr/bin/perl 
use strict; 
use warnings; 
my $res1 = [5,8,10,12]; 
my $res2 = [3,8,10,12]; 
foreach my $index (0..$#{$res1}){ 
    if ($res1->[$index] == $res2->[$index]){ 
     print "Index: $index, Equal: YES"; 
    } 
    else{ 
     print "Index: $index, Equal: NO"; 
     print " [Expected: $res1->[$index], GOT: $res2->[$index]]"; 
    } 
    print "\n"; 
} 

출력 :

[email protected]:~/Desktop$ perl test.pl 
Index: 0, Equal: NO [Expected: 5, GOT: 3] 
Index: 1, Equal: YES 
Index: 2, Equal: YES 
Index: 3, Equal: YES 

채팅에 대한 논의 사항에 따라 :

$의 각 인덱스에 arrayrefs가 있기 때문에 RES1 및 $ res2. 따라서 아래 같은 것을 사용해야합니다

#!/usr/bin/perl 
use strict; 
use warnings; 

my $res1 = [[5],[4],[3],[2]]; 
my $res2 = [[5],[4],[3],[1]]; 
foreach my $index (0..$#{$res1}){ 
    foreach my $inner_index (0..$#{$res1->[$index]}){ 
     if ($res1->[$index]->[$inner_index] == $res2->[$index]->[$inner_index]){ 
      print "Equal!! expected: $res1->[$index]->[$inner_index] got: $res2->[$index]->[$inner_index]\n" ; 
     } 
     else{ 
      print "Not Equal!! expected: $res1->[$index]->[$inner_index] got: $res2->[$index]->[$inner_index]\n" 
     } 

    } 

} 
+0

회신 @chankey 감사, 내가 실종됐다지만, 당신은 "테스트를 사용하지 않고 비교할 수있는 방법을 말해 줄 수 : :"및 내 최종 최종 O/P는 어떤 현명한 결과를 표시 해야하는 로그를 생성하는 것입니다, 통과하든 실패하든간에 –

+0

편집 된 답변을 확인하고 모듈을 사용하지 않는 솔루션도 추가했습니다. –

+0

Thanx @Chankey. –