A simple approach :
use strict ;
use warnings ;
my %initial = () ;
my %seen = () ; # increment if animal is seen
my $new_value ;
# Load initial values
open FILE, '<', 'file1.txt' or die 'Failed to open file1' ;
while ( my $line = <FILE> ) {
my ($animal, $count ) = split " ", $line ;
$initial{$animal}=$count ;
}
close FILE ;
# Open file to look for new animals
open UPDATE , '<', 'file2.txt' or die 'Failed to open file2' ;
while ( my $line = <UPDATE> ) {
# We assume a special pattern form your example file
my $animal = $1 if $line =~ m/^(\w+) feed/ ;
$seen{$animal}++ ;
}
close UPDATE ;
# Open result file for writing
open FILE, '>','file1.txt' or die 'Failed to open file1 for writing';
foreach ( sort keys %initial) {
#Deal with the three possible case :
#new animal, previously existing but unseen, or existing and seen
if ( defined $seen{$_} and not defined $initial{$_} ) {
$new_value = 1
} elsif ( not defined $seen{$_} and defined $initial{$_} ) {
$new_value = $initial{$_}
} else {
$new_value = $initial{$_} + 1
}
print FILE "$_ $new_value\n" ;
}
close FILE ;