#!/usr/bin/perl # http://perlmonks.org/?node_id=1144184 use strict; use warnings; sub e { /\Gua/gc ? return e() : /\Gu/gc || return 0; 1 while (/\Gd/gc && e() && /\Gf/gc or /\Gb/gc) && e() or /\Gc/gc; return 1; } for (qw( u udufu uau uu uc ubu ucbuc uaau ua uauau uccc uauuau )) { print e() && /\G\z/ ? "matches" : " fail", " $_\n"; }