Я использовал libpcre с C, где я мог определять выноски. Они помогли мне легко совместить не только слова, но и любые подвыражения в любом порядке. Регулярное выражение выглядит так:
(?C0)(expr1(?C1)|expr2(?C2)|...|exprn(?Cn)){n}
, а функция выноски защищает то, что каждое подвыражение сопоставляется ровно один раз, например:
int mycallout(pcre_callout_block *b){
static int subexpr[255];
if(b->callout_number == 0){
//callout (?C0) - clear all counts to 0
memset(&subexpr,'\0',sizeof(subexpr));
return 0;
}else{
//if returns >0, match fails
return subexpr[b->callout_number-1]++;
}
}
. Что-то вроде этого должно быть возможно и в perl .