#! perl -slw use strict; use vars qw[$LEN $N $SPARSE $CHECK]; use Benchmark qw[cmpthese]; our $str = '17341234'; $str .= '....____' x $SPARSE if $SPARSE; $str x= ($LEN || 5); our (@ari, @buk, @dio, @enlil); my $test = { ari1=> q[ $ari[1] = $str; local *_ = do{ \$ari[1] }; our $i = 0; *_ = \substr( $ari[1], $i ) while s[(.)(...)\1(?{ $i = pos() - 4 })][a$2b]; ], buk1=> q[ $buk[1] = $str; substr($buk[1], $_, 5) =~ s[(.)(...)\1][a$2b] for 0 .. length ($buk[1]); ], buk2=> q[ $buk[2] = $str; for( 0 .. length($buk[2]) ) { substr($buk[2], $_, 5) =~ s[(.)(...)\1][a$2b] }; ], buk3=> q[ $buk[3] = $str; my $i; $i = pos($buk[3])-5 , substr( $buk[3], $i, 5) =~ s[(.)(...)\1][a$2b] , pos($buk[3]) = $i while $buk[3] =~ m[(.)(...)\1]g; ], dio1=> q[ $dio[1] = $str; 1 while $dio[1] =~ s/(.)(...)\1/a$2b/; ], dio2=> q[ $dio[2] = $str; $r = 0; 1 while substr($dio[2],$r) =~ s/(.)(...)\1(?{$r = pos() - 3})/a$2b/; ], dio3=> q[ $dio[3] = $str; $r = 0; 1 while substr($dio[3],$r) =~ s[(.)(...)\1(?{$r +=pos() - 4})][a$2b]; ], enlil=> q[{ $enlil[1] = $str; our $i = 0; pos($enlil[1]) = $i - 4 while $enlil[1] =~ s[\G (.*?) (.) (...) \2 (?{ $i = pos() }) ] [ defined $1 ? $1.'a'.$3.'b' : 'a'.$3.'b' ]ex; }], }; # A bug with Lvalue refs cause Ari1 to segfault if executed more than twice! delete $test->{ari1}, $ari[1] = 'Test not performed' if $N < 1 or $N > 2; cmpthese( $N||-3, $test ); exit unless $CHECK; print " Ari1:$ari[1] buk1:$buk[1] buk2:$buk[2] buk3:$buk[3] dio1:$dio[1] dio2:$dio[2] dio3:$dio[3] enll:$enlil[1] "; __END__