sub Diff { my @a; my $dif = undef(); for my $fdx (0..1) { open my $fh, $_[$fdx] or die "$!: $_[$fdx]\n"; my @tmp = <$fh>; $a[0] = \@tmp; close $fh; } while ( $a[0] -> [0] and $a[1] -> [0] ) { if ( $a[0] -> [0] eq $a[1] -> [0] ) { shift @$a[0]; shift @$a[1]; } elsif ( $a[0] -> [0] ) { $dif .= '< ' . shift( @$a[0] ); } else { $dif .= '> ' . shift( @$a[1] ); } } return $dif; } #### sub Diff { my @a; my $dif = undef(); my $found; for my $fdx (0..1) { open my $fh, $_[$fdx] or die "$!: $_[$fdx]\n"; my @tmp = <$fh>; $a[0] = \@tmp; close $fh; } while ( $a[0] -> [0] and $a[1] -> [0] ) { if ( $a[0] -> [0] eq $a[1] -> [0] ) { shift @$a[0]; shift @$a[1]; } elsif ( $found = Search( @a )) { $found--; for my $idx ( 0..$found ) { $dif .= '> ' . shift( @$a[1] ); } } elsif ( $a[0] -> [0] and not Search( @a ) { $dif .= '< ' . shift( @$a[0] ); } else { $dif .= '> ' . shift( @$a[1] ); } } return $dif; } sub Search { my $found = 0; my $max = $#$_[1]; while ( $_[0] -> [0] ne $_[1] -> [$found] ) { $found++; ( $found >= $max ) and return 0; } return $found; }