A couple of recent newbie-class queries (see
Replace part of a regex match,
replace text with function ?) have brought to my attention something I've naturally considered in the past but dismissed as I've known alternative ways to solve the problem.
Often text substitution is performed using the s/// operator (see perlop). E.g.
my $text = "The cow jumped over the moon";
$text =~ s/(\w+\s+)jumped/$1tripped/;
One might often consider a more natural way of expressing this as:
if ( $text =~ m/cow\s+(jumped)\s+over/ ) {
$1 = "tripped";
}
but of course this is not possible in Perl 5.
In fact it's not been uncommon to be finding myself wishing I could express such if match-replace expressions, not least because I might have other triggers that need to occur in the event that the match was made, e.g.:
if ( $text =~ m/cow\s+(\w+)\s+over/ ) {
do_action( $1 );
$1 = calculate_new_action( $1 );
}
rather than
if ( $text =~ m/cow\s+(\w+)\s+over/ ) {
do_action( $1 );
my $new_action = calculate_new_action( $1 );
$text =~ s/(cow\s+)(\w+)(\s+over)/$1$new_action$3/;
}
I wonder if others consider allowing the captured variables to be modified as possible and/or pragmatic?