Hi, If I understood your question correctly, try this & see the Benchmark,
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark 'cmpthese';
cmpthese(-1, {
method1 => '&yours',
method2 => '&new_one',
});
sub yours{
my %mapper;
open(MAP, "<map.ini");
while (<MAP>) {
chomp;
tr/A-Z/a-z/;
my @map_line = split (/\t/);
$mapper{$map_line[0]} = $map_line[1];
}
close(MAP);
open(IN, "<input1.txt");
open(OUT, ">input_new.txt");
while (<IN>) {
#print "%";
tr/A-Z/a-z/;
foreach my $key (sort keys %mapper) {
s/\b$key\b/$mapper{$key}/g;
}
print OUT "$_";
}
close(IN);
close(OUT);
}
sub new_one{
open(MAP, "map.ini");
my $map = do{local $/;<MAP>};
close(MAP);
my %mapper;
$map = lc($map);
%mapper = map{split/\t/,$_} split(/\n/, $map);
open(IN, "input1.txt");
my $input = do{local $/;<IN>};
close(IN);
open(OUT, ">input_new.txt");
$input = lc($input);
foreach my $key (sort keys %mapper) {
$input =~ s/\b$key\b/$mapper{$key}/g;
}
print OUT $input;
close(OUT);
}
__END__
Rate method1 method2
method1 908/s -- -13%
method2 1050/s 16% --
I have check with less number of lines file only. You can check with your input.
Regards,
Velusamy R.
eval"print uc\"\\c$_\""for split'','j)@,/6%@0%2,`e@3!-9v2)/@|6%,53!-9@2~j';