Вы должны экранировать разделитель для qr //, и вы должны экранировать все метасимволы регулярных выражений, которые вы хотите использовать в качестве литералов. Если вы хотите, чтобы они были буквальными *, вам нужно избегать их, поскольку * является квантификатором регулярных выражений.
Ваша проблема здесь заключается в различных флагах регулярных выражений, которые вы добавили. / M ничего не делает, потому что вы не используете якоря начала или конца строки (^, $). / S ничего не делает, потому что вы не используете подстановочный знак. метасимволом. / X делает все пустое пространство в вашем регулярном выражении бессмысленным, и превращает эту строку с # в комментарий регулярного выражения.
Это то, что вы хотите, с удаленными флагами регулярных выражений и правильными вещами:
my $sc = qr{(>|\s)};
my $re = qr{# using defaults found in \.config
\*
\*
Options:
$sc 1\. opt1
$sc 2\. opt2
choice\[1-2\?]: };
Несмотря на то, что Дамиан Конуэй говорит в Perl Best Practices , что эти опции всегда должны быть в их регулярных выражениях, теперь вы понимаете, почему он не прав. Вы должны добавлять их только тогда, когда вы хотите, чтобы они делали, и вы должны добавлять вещи, только когда знаете, что они делают. :) Вот что вы можете сделать, если вы хотите использовать / х. Вы должны избегать любых буквальных пробелов, вам нужно как-то обозначать окончания строк, и вы должны избегать буквального символа #. То, что раньше было читаемым, теперь беспорядок:
my $sc = qr{(>|\s)};
my $eol = qr{[\r\n]+};
my $re = qr{\# \s+ using \s+ defaults \s+ found \s+ in \s+ \.config $eol
\* $eol
\* $eol
Options: $eol
$sc \s+ 1\. \s+ opt1 $eol
$sc \s+ 2\. \s+ opt2 $eol
choice\[1-2\?]: \s+
}x;
if ( $output =~ $re ) {
print "OK!\n";
}
else {
print "D'oh!\n";
}