От в этой статье,
/^1?$|^(11+?)\1+$/
проверяет, является ли число (его значение в унарном) простым или нет.
Используя это, perl -l -e '(1 x $_) !~ /^1?$|^(11+?)\1+$/ && print while ++$_;'
возвращает список простых чисел.
У меня недостаточно опыта работы с Perl, но я понимаю, что регулярное выражение будет true для числа, которое не является простым. Итак, если мы напечатаем все числа, которые не выражают true с этим выражением, у нас есть список простых чисел. То, что пытается выполнить запрос perl.
О части регулярного выражения,
^1?$
часть предназначена для подсчета 1 как не просто
^(11+?)\1+$
предназначен для сопоставления не простых чисел, начиная с 4.
То, что я не понимаю, - это то, что ?
в регулярном выражении вообще необходимо.
По мне /^1$|^(11+)\1+$/
должно быть просто отлично и на самом деле
perl -l -e '(1 x $_) !~ /^1$|^(11+)\1+$/ && print while ++$_;'
дает мне тот же набор простых чисел.
Есть ли недостаток в моем понимании регулярного выражения? Почему нужен ?
?
Не соответствует ли ?
нулю или одному вхождению предшествующего ему выражения?