От в этой статье,
/^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 ++$_;'
дает мне тот же набор простых чисел.
Есть ли недостаток в моем понимании регулярного выражения? Почему нужен ??
Не соответствует ли ? нулю или одному вхождению предшествующего ему выражения?