use strict; use warnings; use Time::HiRes qw(time); use constant TIMEOUT => 1; my $bigString = pack "C*", 33 .. 126; $bigString = $bigString x 1_000_000; my $time_to_die = time + TIMEOUT; eval { local $SIG{ALRM} = sub { die "regex timed out at ", time, "\n" }; alarm TIMEOUT; print "time to die at $time_to_die\n"; print "begin regex at ", time, "\n"; my ( $foo, $bar, $baz ) = $bigString =~ /(?{1})(abc).*(def).*(ghi)/; print "foo = $foo, bar = $bar, baz = $baz\n"; print "end regex at ", time, "\n"; alarm 0; }; print "error while regex. $@\n" if $@; use Benchmark qw(:all); cmpthese ( 5, { 'mit ' => sub { $bigString =~ /(?{1})(abc).*(def).*(ghi)/ }, 'ohne ' => sub { $bigString =~ /(abc).*(def).*(ghi)/ } } );