grep
EXPR
,
LIST
grep
BLOCK
LIST
This function evaluates
EXPR
or
BLOCK
in a Boolean context
for each element of
LIST
,
temporarily setting
$_
to each element in turn.
In list context, it returns a list of those elements
for which the expression is true.
(The operator is named after a beloved UNIX program that
extracts lines out of a file that match a particular pattern.
In Perl the expression is often a pattern, but doesn't have to be.)
In scalar context,
grep
returns the number of times the
expression was true.
Presuming
@all_lines
contains lines of code, this example weeds out
comment lines:
@code_lines = grep !/^#/, @all_lines;
Since
$_
is a reference into the list value, altering
$_
will modify the elements of the original list.
While this is useful and supported, it can occasionally cause bizarre
results if you aren't expecting it. For example:
@list = qw(barney fred dino wilma);
@greplist = grep { s/^[bfd]// } @list;
@greplist
is now "
arney
",
"
red
", "
ino
", but
@list
is now "
arney
",
"
red
", "
ino
",
"
wilma
"! Caveat Programmor.
See also
map
. The following two statements
are functionally equivalent:
@out = grep {
EXPR
} @in;
@out = map {
EXPR
? $_ : () } @in