in reply to Tied scalars to emulate $&, $' and $` without global performance hit
Here's a variation on your theme:
##### MatchVars.pm ##### package MatchVars; use strict; use warnings; sub tie { my %args = @_; my $string = delete $args{string} || return; while(my($k,$v) = each %args){ tie $$v, $k, $string } } package match; sub TIESCALAR {bless [$_[1]],$_[0]} sub FETCH {substr(${$_[0][0]}, $-[0], $+[0] - $-[0] )} package pre; use base "match"; sub FETCH {substr(${$_[0][0]},0, $-[0] )} package post; use base "match"; sub FETCH {substr(${$_[0][0]}, $+[0] )} 1; __END__ ##### match_test.pl ##### #!/usr/bin/perl -w use strict; use warnings; use MatchVars; my ( $match, $pre, $post, $string ); MatchVars::tie( string => \$string, pre => \$pre, match => \$match, post => \$post ) || die "Can't tie matchvars"; $string = "This is a contrived test string..."; if ( $string =~ /contrived/) { print $pre,"\n"; print $match, "\n"; print $post, "\n"; } $string = 'and something else entirely'; if ( $string =~ m/thing/ ) { print $pre,"\n"; print $match, "\n"; print $post, "\n"; } __END__
|
|---|