> <Script>
> #Perl Script to Compare two backup logs and then identify
> # substantial differences in changed tables.
> use strict;
> use warnings;
> 
> #Open the newer backup log.
> open FILE, "C:/tmp/max_grow/max1.log" or die "Cann't open : $!";
> while(<FILE>){
>     chomp;
> 
> #Input to be divided in two:
> #Sample of file is -
>     #                      APPDOCTYPE         43 
>     #                        APPLAUNCH         16 
>     #                           APTRANS       1245 
>     #                           ARCHIVE          0 
>     #                           ASICUST         24 
>     #                           ASILINK          5 
>     #               ASSETATTRIBUTE        736 
>     #                     ASSETCLASS       1667 
>     #                    ASSIGNMENT      60648 
>     #                    ATTENDANCE     103193 
> 
> #Divide the input into two groups    
>     s/(.*\D)+(.*\d)/$2  $1/;

If you are only interested in $1 and $2 why use a s///, just a m/// or ///
would do.

> 
> #Pass the two groups to variables
> my $value1 = $2;
> my $tblnam1 = $1;

Assigning contents from $1, $2 ... etc. must be done inside a condition 
that checks for the success of the regex. These variables are not cleared, 
if the regex fails they will still contain the old values.

> 
> #Remove all unnecessary spaces.
>     for ($tblnam1) {
>         s/^\s+//;
>         s/\s*$//;}
>     for ($value1) {
>         s/^\s+//;
>         s/\s*$//;}

You could have avoided the chomp, regexes etc. by using split (perldoc -f 
split). In particular the default behaviour of split. 
my ($tblnam1,$value1) = split;
$tblnam1 and $value1 will now contain the values you want in them.

> 
> #Open the older log  
>       open FILE2, "C:/tmp/max_grow/max4.log" or die "Cann't open : $!";
>         while(<FILE2>){
>             chomp;
>             s/(.*\D)+(.*\d)/$2  $1/;
> 
>             my $value2 = $2;    
>             my $tblnam2 = $1;
>             
> 
>             for ($tblnam2) {
>                 s/^\s+//;
>                 s/\s*$//;}
>             for ($value2) {
>                 s/^\s+//;
>                 s/\s*$//;}

The same holds here too, default behaviour of split

> 
> # Compare the two logfiles here.
>                 if($tblnam1 eq $tblnam2) {
>                    my $diff = $value2 - $value1;
>                    if($diff > 1000){
>                        print "$tblnam1 :The difference is $diff\n";
>                    }
>                 }
>    
>         }    
> }
> </End Script>
 
It seems like for every line in log1 you are opening log2 and doing the 
comparison. With m lines in log1 and n lines in log2 you are performing 
m*n operations. A better option would be to open log1 and form a hash.

open (LOG1, $your_first_log) or die "....";
while (<LOG1>) {
        my ($tablnm1, $value1) = split;
        $comp_log{$tablnm1} = $value1;
}
close <LOG1> or warn ".....";

Now loop through log2 and check if a key with tblnam2 exists in the hash 
and if it does subtract the values for the result.

open (LOG2, $your_second_log) or die "....";
while (<LOG2>) {
        my ($tablnm2, $value2) = split;
        if (defined $comp_log{$tablnm2}) {
                # Doing your difference check here
        }
}
close (LOG2) or warn ".....";


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to