#!/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 참조의 값을 비교하는 방법은 무엇입니까?
을 그것은 단지 다시'내 $ 항목 (@의 $ 목록)'수를 foreach는 역 참조에 col1' = \ @ $리스트'배열에 대한 참조를 복사하는 이상한 접근법 그 뒤에있는 생각을 설명해 주시겠습니까? 또한'my ($ list, $ tblname, $ values)'가 너무 일찍 선언 될 이유가없는 것 같습니다. 서브 루틴 전체에서 사용할 필요가 없습니다. – Borodin
@ Borodin 귀하의 제안에 감사드립니다. 그러나이 논리는 약 백만 행에 대해 구현되어야합니다. 그래서 더 안전한 측면을 위해 값을 저장하기 위해 항상 참조를 사용하는 것입니다. 그리고 "my ($ list, $ tblname, $ values)"변수는 다른 서브 루틴에서 사용해야합니다. 다른 제안은 환영합니다. –