use Regexp::Debugger; my $re=qr{(?x) (?&LIST) (?(DEFINE) (? < (?&ITEM) (?: , (?&ITEM))*+ > ) (? \d*+ | (?&LIST) ) ) };