in reply to Simple Matching

Try

print "[$_]:", eval "\$string =~ tr/$_//";

Note: this may be slower than your original.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
RIP PCW It is as I've been saying!(Audio until 20090817)

Replies are listed 'Best First'.
Re^2: Simple Matching
by rnroot (Initiate) on Sep 28, 2009 at 05:04 UTC
    Thank you both. I was looking at Friedl's book on RegEx and wrapping myself up in eval's when both of you replied. Thank you. I am working on optimizing a bit of code and have not needed eval yet. Is there a workaround for this specific example, e.g., "grep -c"? Counting characters in a string should be fast and simple.

      It's only getting compiled once, just as if it was outside of eval, so what's the problem?

      If you wanted to reuse the counter, make a sub if it:

      $counters{$_} = eval "sub { \$_[0] =~ tr/\Q$_\E// }";
        Thanks again, Putting the eval into Method 2 below is (much) slower than any other match (as noted by BrowserUK). Brute force (Method 3) is significantly faster than either 1 or 2, but does not let me loop through an array to check match counts. I have tried "grep -c" within perl and it works, but is not as fast as brute force. Is there a faster way? After 15+ years of Perl I have not needed to worry about cutting edge optimizing (in Perl) ... ergo my ignorance. Thanks for help again.
        my $flush = 0; my @suits = ( "D", "S", "C", "H" ); my $long_hand = ("2H 3D 4C 5S 5H)"; # Method 1: 43 microseconds # (My initial code ... seemed slow ... ergo benchmark) foreach ( @suits ) { @m = ( $long_hand =~ m/$_/g ); $flush = 1 if ($#m eq 4 ); } # Method 2: 126 microseconds (definitely bottleneck) foreach ( @suits ) { my $count = ( eval "\$long_hand =~ tr/$_//" ); $flush = 1 if ($count eq 5 ); } #Method 3: accounts for only 3(!) microseconds of code # Ugly but functional for very few patterns to check # BUT what if I had 10k patterns to check $flush = 1 if ( $long_hand =~ tr/D// eq 5); $flush = 1 if ( $long_hand =~ tr/S// eq 5); $flush = 1 if ( $long_hand =~ tr/C// eq 5); $flush = 1 if ( $long_hand =~ tr/H// eq 5);