in reply to match lines containing state abbreviation

G'day PerlSufi,

In a boolean context, any non-zero-length string evaluates to TRUE. So the grep expression will always be TRUE and @keepers will be a copy of @lines.

$ perl -Mstrict -Mwarnings -E ' my $match = "AZ"; my @lines = qw{AZ SX AZ DC}; my @keepers = grep { $match } @lines; say "@keepers"; ' AZ SX AZ DC

What you need to do to filter @lines, is make the grep expression a regular expression (i.e. /$match/).

$ perl -Mstrict -Mwarnings -E ' my $match = "AZ"; my @lines = qw{AZ SX AZ DC}; my @keepers = grep { /$match/ } @lines; say "@keepers"; ' AZ AZ

-- Ken

Replies are listed 'Best First'.
Re^2: match lines containing state abbreviation
by PerlSufi (Friar) on Apr 18, 2013 at 18:04 UTC
    this worked
    my $match = "AZ"; my $content = $mech->content; my @lines = split /^/, $content; my @keepers = grep {/\Q$match\E/} @lines; print @keepers;
Re^2: match lines containing state abbreviation
by PerlSufi (Friar) on Apr 18, 2013 at 17:47 UTC
    Thanks for the response, Ken. That is helpful how you explained it. However, should I make the $content an array of lines to match? I have taken out the foreach operator right now..

      Splitting the lines to create an array is probably what I would have done. However, if you want to work directly with a multiline string, here's one way to do it:

      $ perl -Mstrict -Mwarnings -E ' my $lines = "AZ\nSX\nAZ\nDC\nAB\nYZ\n"; say $lines; $lines =~ s/(?>[^A].|.[^Z])\n//gm; say $lines; ' AZ SX AZ DC AB YZ AZ AZ

      In my opinion, the multiline solution is a lot more cryptic than the array solution.

      -- Ken