perl -le 'print for a .. z' | perl -nle 'if (/d/ .. /h/) { next unless "m//"; print }'
####
for my $c ( 'a'..'z') {
next unless ($c =~ /[d-h]/); say $& if $&;
}
####
# The regex capture variables are only reset on the next successful match.
# This way, Perl saves a lot of time by not affecting variables when matches
# fail. As such, only use those variables with a guard, to wit:
# if ( /abc/ ) { # this tests for /abc/ success and now it's OK to use $&
# ...
# }
# Here's an extended demonstration, with a special surprise at the end:
say "First long example...\n";
$_ = 'Hello Perl';
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# successful match
/(P)(erl)/;
print "First match\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# unsuccessful match
/(P)(ython)/;
print "Failed capture\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# successful match again
/(Pe)(r)(l)/;
print "Three captures\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# successful match, fewer captures
/(Perl)/;
print "One capture\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# successful match, no captures
/Perl/;
print "No captures\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";
# successful match, no pattern, special case
//;
print "No nothing\n";
print "\$1: $1\n\$2: $2\n\$3: $3\n\$&: $&\n\n";