Когда я скомпилирую эту строку в регулярное выражение, вот так:
my $pattern = "javascript:window.open\('([^']+)'\);";
my $regex = qr/$pattern/;
Я получаю именно то, что, как я думаю, должен получить, следующее регулярное выражение:
(?-xism:javascript:window.open('([^']+)');)/
Обратите внимание, что это оноищет группу захвата , а не открытую парню в конце 'open'.И в этой группе захвата первое, что он ожидает, это одиночная кавычка.Таким образом, он будет соответствовать
javascript:window.open'fum';
, но не
javascript:window.open('fum');
Одна вещь, которую вы должны изучить, это то, что в Perl, "\("
- это то же самое, что и "("
выпросто говорю Perl, что вы хотите литерал '('
в строке.Чтобы получить длительные побеги, вам нужно удвоить их.
my $pattern = "javascript:window.open\\('([^']+)'\\);";
my $regex = qr/$pattern/;
Фактически сохраняет литерал (
и дает:
(?-xism:javascript:window.open\('([^']+)'\);)
Что я и хочу, что вы хотите.
Что касается вашего вопроса, вы должны всегда проверять результаты матча, прежде чем использовать его.
if ( $mech->content =~ m/($pattern)/ ) {
print $1;
}
имеет гораздо больше смысла.И если вы хотите увидеть это независимо, то это уже подразумевает, что это может не иметь значения.то есть вы, возможно, ничего не соответствовали.В этом случае лучше поставить альтернативы
$mech->content =~ m/($pattern)/;
print $1 || 'UNDEF!';
Однако я предпочитаю захватывать мои захваты в одном и том же утверждении, например так:
my ( $open_arg ) = $mech->content =~ m/($pattern)/;
print $open_arg || 'UNDEF!';
Парень вокруг $open_arg
ставитсопоставить с "списком контекста" и вернуть записи в списке.Здесь я ожидаю только одного значения, так что это все, что я предусматриваю.
Наконец, одна из основных причин ваших проблем заключается в том, что вам не нужно указывать выражение в строке, чтобы ваше регулярное выражение было «переносимым».Вы можете получить Perl для предварительной компиляции вашего выражения.Таким образом, вас интересует только то, какие символы используются для регулярных выражений, а не то, будете ли вы сохранять свои экранированные символы, пока они не будут скомпилированы в выражение.
Скомпилированное регулярное выражение будет правильно интерполироваться в другие регулярные выражения.Таким образом, вы получаете переносимое выражение, которое интерполирует так же хорошо, как и строку - и, в частности, правильно обрабатывает инструкции, которые могут быть потеряны в строке.
my $pattern = qr/javascript:window.open\('([^']+)'\);/;
Это все, что вам нужно.Тогда вы можете использовать его, как и вы.Хотя, помещая в скобки все это, можно было бы вернуть все совпадающее выражение (а не только то, что находится в кавычках).