sub on (&$$) { my($f1,$f2,$l)=@_; local $_=$$l; if (&$f1) { local *_=$l; &$f2($l); } } sub action (&) { shift } $a="abba is foo"; on { /foo/ } action { tr/ab/ba/; },\$a; print "$a\n";