sub { my $s = shift; return undef if !defined $s; my $pos = 0; my $state = 1; my $done; while (1) { my $char = substr($s, $pos, 1); if ($state == 4) { $done = $pos; last if !defined $char; if ($char eq "a") { $state = 4; next; } if ($char eq "b") { $state = 4; next; } last; } if ($state == 1) { last if !defined $char; if ($char eq "a") { $state = 2; next; } if ($char eq "b") { $state = 3; next; } last; } if ($state == 3) { last if !defined $char; if ($char eq "a") { $state = 2; next; } if ($char eq "b") { $state = 4; next; } last; } if ($state == 2) { last if !defined $char; if ($char eq "a") { $state = 4; next; } if ($char eq "b") { $state = 3; next; } last; } die "error: Unknown state: $state"; } continue { $pos++; } if (!defined $done) { return undef; } substr($s, 0, $done); }