in reply to Re: Missing $ on loop variable
in thread Missing $ on loop variable

When I see a ternary used in that fashion, I can't help but imagine you're one step away from condensing that down to:

$line=~/$_/i&&push(@found,$_)for@keywords;

Myself, I'd expand it a bit:

for (@keywords) { next unless $line =~ /$_/i; push @found, $_; }

I think it's a bit clearer and more obvious what's going on. Nothing earth-shattering, but a lot of these kind of things can add up.

Update: then again, I might even go sideways on it:

my @found = grep { $line =~ /$_/i } @keywords;

Replies are listed 'Best First'.
Re^3: Missing $ on loop variable
by psychotic (Beadle) on Dec 02, 2005 at 21:52 UTC
    Me and the ternary operator have a special relationship actually, i suppose it shows. Now that i take a more calm look at it, i'll take it one step further. I think the most elegant of all would actually be:
    foreach (@keywords) { push @found, $_ if $line =~ m/$_/i; }

    next is not really useful, and dare i say obsolete, since there is no other code aside the regexp conditional in the foreach block. As for the grep rewrite, there is a gotcha, which might complicate things in certain situations. But i'll save it for another day since it isn't relevant to this thread. But if anyone is interested take a look here.

      next is not really useful, and dare i say obsolete, since there is no other code aside the regexp conditional in the foreach block

      I'd say I agree it's not useful in this code, but calling it obsolete doesn't make a whole lot of sense. You must be operating with a different definition of obsolescence than I am. ;-)

      As for the grep rewrite, there is a gotcha, which might complicate things in certain situations. But i'll save it for another day

      Please, by all means, don't save it for another day. Even for those of us who might already know of this "gotcha", mentioning it without even narrowing it down is not all that nice (and no, linking to the grep docs does not narrow it down). :-)

        As for the "obsolete" part, i used it --evidently badly-- as a synonym to "since there is no other code ... in the foreach block". Of course i was only refering to this snippet since next is invaluable in loop control. But i'm sure you knew that already. ;)

        As for the grep gotcha, here is the situation. Given this code:

        my $line = "Alpha and some beta junk here"; my @keywords = qw(alpha beta gamma); foreach (grep { $line =~ /$_/i } @keywords) { $_ = rand; } foreach (@keywords) { print "$_\n" }
        We get when run:
        0.623870849609375 0.16607666015625 gamma
        Grep aliases the current value of $_ to the original array element, and thus modifying it actually tampers our original data. It wasn't any special complication really, but has the potential to obfuscate a bug or two.