in reply to Re: Regex matching on anywhere but the beginning or end of a line
in thread Regex matching on anywhere but the beginning or end of a line
The program is moving data from one MySQL database to another. The subroutine gets passed a hash_ref to a map and a hash_ref from the source database as returned by $query->fetchrow_hashref. The map looks like...$ticks = time(); .... $ticks = time() - $ticks; print "$count Records updated in $ticks seconds\n";
The makemap sub returns a string that can be used in the SET portion of an INSERT sql statement. The code snippet follows.my(%map) = qq( 'AMNT_PAID', '0.0', 'AMOUNT', '{PurchAmt}', 'DELIVERY_NOTE', '"{Delivery}"', 'EXPORTED', 'IF({Exported}, "Y", "N")', 'FUNDS', 'IF("{CompanyID}"="BCU", "USD" +, "CAD")');
Averaged over two runs each with 17400 records with 750 "pathological" records (with embedded double quotes)the results seem to indicate the iterative method is faster than the regex way but I like the elegance of the regular expression.# Create a set list from the data and the data map sub makemap { my($map, $r) = @_; my($key, $result, $t, %h, $ndx); %h=%$r; $result=""; foreach $key (sort(keys(%$map))) { #print "$key:\t$map->{$key}\n"; $t = $map->{$key}; # substitute the actual value for the placeholder fieldname $t =~ s/(\{\S+\})/defined(eval("\$h$1")) ? eval("\$h$1") : "NULL +"/eg; # replace any double quotes with escaped doubles if ((substr($t,0,1) eq '"') && (length($t) > 2)) { # best 196 sec # $ndx = 1; # while( ($ndx = index($t, '"', $ndx)) != -1 and ++$ndx < len +gth($t)) { # substr($t, $ndx++, 0, '"'); # } # original 198 sec # for ($ndx=1; $ndx < length($t)-1; $ndx++) { # if (substr($t,$ndx,1) eq '"') { # substr($t,$ndx,1) = '""'; # $ndx++; # } # } # substring 204 sec # substr($t, 1, -1) =~ s/"/""/g; # zero width assertion 201 sec $t =~ s/(?<=.)"(?=.)/""/g; } #print "$t\n"; $result .= qq($key=$t ,); } chop($result); # remove trailing , return($result); }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Regex matching - Actual code and benchmarks - on anywhere but the beginning or end of a line
by Abigail-II (Bishop) on Feb 25, 2003 at 08:19 UTC |