From: "R. Joseph Newton" <[EMAIL PROTECTED]>
> "John W. Krahn" wrote:
> 
> > This is the closest but you need a separate match for each letter
> >
> > > #       print $_ if /a\&e\&i\&o\&u/gi; # try a bitwise "and", with
> > > #       escapes print $_ if !/[bcdfghjklmnpqrstvwxyz]/gi; # try
> > > #       not matching consonants
> > >         print $_ if /(a+)(e+)(i+)(o+)(u+)/gi; # "LOTS of
> > >         parentheses"
> >
> > By default print() prints the contents of $_ if there are no
> > arguments so "print if ..." does the same thing.  Also none of your
> > matches require the /g option.
> >
> > > }
> > >
> > > AAAAAAAARRRRRRRRRRGGGGGGGGGGGGHHHHHHHHH!!!!!!!!!
> >
> > Fun, isn't it?  :-)
> 
> Hi John,
> 
> I think this is one that sort of defeats the one-liner, or at least
> the single regex:
> 
> But oh, I get mad!
> 
> if (/a/i and /e/i and /i/i and /o/i and /u/i) {print;}

It might be quicker if you do some work before trying the regexps:

while (<>) {
        chomp;
        print "\tOK ($_)\n" 
                if do {(local $_ = lc($_)) =~ tr/aeiou//dc;
                        /a/ and /e/ and /i/ and /o/ and /u/
                }
}

This looks strange mainly due to the fact that I use $_ everywhere.
If I used an ordinary variable in the loop it could look like this:

while ($line = <>) {
        chomp($line);
        local $_ = lc($_);
        tr/aeiou//dc;
        print "\tOK ($line)\n"
                if (/a/ and /e/ and /i/ and /o/ and /u/);
}

Basicaly all I do is I copy the string lowercased into another 
variable, remove all characters except the aeiou and then test the 
regexps agains that much shorter string.

If I add a length test (string of 4 characters cannot contain all 
five we search for) I can make it even quicker:

while (<>) {
        chomp;
        print "\tOK ($_)\n" 
                if do {(local $_ = lc($_)) =~ tr/aeiou//dc;
                        length($_) >=5 and /a/ and /e/ and /i/ and /o/ and /u/
                }
}

or

while ($line = <>) {
        chomp($line);
        local $_ = lc($_);
        tr/aeiou//dc;
        print "\tOK ($line)\n"
                if (length($_) >=5 and /a/ and /e/ and /i/ and /o/ and /u/);
}

Benchmarking is left to the reader as a simple homework.

Jenda
P.S.: What about "Y" ?
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to