in reply to Re: Shorten script
in thread Shorten script

Since you're printing more or less the same thing, see if you can combine the patterns you're matching against thusly:
while($line = <F>) { for my $hit ($line =~ /matchPattern/gi) { $ct++; push @files, $name; print "PAGE ->\t$name\ndata ->"; if( $line =~ /(patternOne|patternTwo)/i ) { print "\t\t$1\nMATCHED - >\t$hit\n"; } else { print " TEXT INFO HERE.\n"; } } }

Replies are listed 'Best First'.
Re: Re: Re: Shorten script
by sauoq (Abbot) on Jul 22, 2003 at 20:21 UTC

    In general, it's more efficient to elevate the "ors" out of the pattern. In other words,

    $line =~ /pat1/ or $line =~ /pat2/
    is usually better than a single more complex regular expression.

    -sauoq
    "My two cents aren't worth a dime.";
    
      Well, yes, but he did say he was trying to shorten his script :)

      I am often a chooser of elegance (subjective, of course) over efficiency.

      So, to combine some efficiency with some elegance:

      while($line = <F>) { for my $hit ($line =~ /matchPattern/gi) { $ct++; push @files, $name; print "PAGE ->\t$name\ndata ->"; if( $line =~ /(patternOne)/i or $line =~ /(patternTwo)/i ) { print "\t\t$1\nMATCHED - >\t$hit\n"; } else { print " TEXT INFO HERE.\n"; } } }
      The $1 will be properly remembered -- although if a line matches both patterns is the or a short circuit operator? You might have to switch the order to keep the behavior identical.
        is the or a short circuit operator?

        Yes. That code should work fine.

        Now, if you take the final step and incorporate a ternary operator in the print statement, you'll have reproduced BrowserUk's version. :-)

        -sauoq
        "My two cents aren't worth a dime.";