in reply to Help with null string behavior in regex?

That isn't right. It isn't that $file =~ $string is always true, it is that in for ( ... ), you never get to the inner guts of the for() if there is nothing in @strings. It is also true that  ... =~ // is also true. Maybe you had a blank line in your input.

I've included a slightly different and to my mind nicer version of your code. You may find it helpful.

my $pattern_file = <STDIN>; chomp $pattern_file; open my $patterns, "<", $pattern_file or die "Can't open '$pattern_fil +e' for reading: $!"; my @patterns = <$patterns>; chomp @patterns; @patterns = grep length(), @patterns; @patterns = map qr/$_/, @patterns; ... foreach my $file ( ... ) { # All patterns must match foreach my $pattern ( @patterns ) { next if $file =~ $pattern; print OUT "'$file' !~ /$pattern/\n"; last; } }

Replies are listed 'Best First'.
Re: Re: Help with null string behavior in regex?
by McMahon (Chaplain) on May 03, 2004 at 21:51 UTC
    I see what this is doing, but I'm going to the shed with the Camel before I'll be comfortable maintaining it.

    BTW, the kluge I used to solve this was
    if ($stringFile eq "") { print "No file of exclude strings specified\n"; @strings = "xyzzy";

    which is effective, but it makes me feel all dirty. =)

      I hoped that what I was doing was clear enough. The real improvements were doing a chomp() on the whole list at once, only once, removing any empty elements, then pre-compiling all the patterns.

      I also changed your for ( ... ) { unless ( ... ) { ...; last } } because it read strangely for me. unless() is like that, sometimes it just reads strangely. Since the intent of that code was to be an "everything matches or I print the file name" I just skipped right to the next pattern if there was a match and made the exception stand out.

        It's definitely clear! But "grep length" and "map qr" haven't made it into my syntactical bag yet.

        I get new stuff to read about every time I post code here.

        BTW, I didn't know "chomp @array" was possible. I posted a question recently trying to "lc @array", which *isn't* possible, so I just figured the same rule applied.