Переменная регулярного выражения perl с косой чертой - PullRequest
1 голос
/ 23 июня 2011

Мне нужно регулярное выражение perl, чтобы проверить, присутствует ли $ currentSearch в $ currentLine. Проверка должна включать в себя, что $ currentLine содержит ключевое слово «Load».

Матч

$currentSearch = DNA/3/44.com/index.html

К

$currentLine = Load DNA/3/44.com/index.html .....(3)

Я пробовал это, но это не соответствует ...

* * 1010

EDIT даже это не работает

 if($currentLine[$k] =~ m/$currentSearch[$i]/)

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

Я подозреваю, что ваши проблемы связаны с неиспользованием:

use strict;
use warnings;

в вашем скрипте.

Прежде всего, строки в ваших первых двух утверждениях, $currentSearch и $currentLine, не имеют кавычек вокруг них. Это, вероятно, опечатка, но выглядит странно.

Во-вторых, в своем операторе if вы называете их массивами, а не скалярами. Предположим, что это не очередная опечатка, которая может стать источником вашей проблемы. $currentSearch и $currentSearch[$i] относятся к двум совершенно различным переменным.

Без строгих предупреждений и даже использования двух необъявленных и неопределенных переменных не вызовет никаких признаков того, что что-то не так.

На самом деле это:

perl -e 'if ($foo[0]=~ /$bar[1]/) { print "sure, why not?" }'

Фактически будет успешным совпадением и выведет строку, даже если обе переменные @foo и @bar полностью пусты. С strict и warnings он рухнет и сгорит, как и должен.

В любом случае, это работает:

my $cs = "DNA/3/44.com/index.html";
my $cl = "Load DNA/3/44.com/index.html .....(3)";

if ( $cl =~ /Load\s+$cs[\s\.]+\((\d+)\)/ ) {
    print "Yes: $1\n";
} else { print "Nope!" }

Если у вас есть какие-либо метасимволы в строке поиска, это может затруднить обнаружение ошибок, в этом случае вы можете попытаться добавить quotemeta в строку поиска.

3 голосов
/ 23 июня 2011

У вас ошибка - вам нужно экранировать символ d, чтобы поймать цифры вместо символа 'd'. Также у вас слишком много обратных слешей (вы пропустили первую пареню).

Вот скрипт, который работает:

$currentSearch = "DNA/3/44.com/index.html";


$currentLine = "Load DNA/3/44.com/index.html .....(3)";


if($currentLine =~ /Load\s+$currentSearch\s+\.+\(\d+\)/) {
    print "matched\n";
} else {
    print "no match\n";
}
0 голосов
/ 23 июня 2011
if ($currentLine =~ /Load\s+\Q$currentSearch\E/) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...