2012-06-13 2 views
0

Не знаю, как это происходит, но кажется, что мои регулярные выражения в perl не обновляются до следующего матча после выполнения матча. Вместо того, чтобы обновлять переменные $ & и $ 1 с каждым соответствием, он застревает в первом.Perl не обновляет до следующего матча

Я смотрю везде и считаю это крайне расстраивающим.

См. Вывод от отладчика ниже, как вы можете видеть, первое совпадение имеет смысл, а второе - нет.

Благодаря

DB<79> $riz =~ m{url=(.*?)Support}; 

    DB<80> p$&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<81> $riz =~ m{href=(.*artist?)}; 

    DB<82> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<83> 

Update: Вот еще один пример, показывающий, что текст «художник» в строке, но она до сих пор не найти. Значение $ riz - это огромный HTML-код, поэтому его трудно опубликовать.

DB<103> $riz =~ m{url=(.*?)Support}; 

    DB<104> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<105> $riz =~ m{artist}; 

    DB<106> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<107> p string.index($riz,"artist"); 
string105 
    DB<108> 

Мой $ Риз это все HTML в этой ссылке http://itunes.apple.com/us/app/id385972277

При использовании агента пользователя Itunes/10,2 (compatible; PPC Mac OS X 10.2)


Вот еще один пример с теми же $ riz

DB<128> $riz =~ m/.*/; 

    DB<129> p $&; 
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support 
    DB<130> 
... 
    DB<136> p substr $riz,0,20; 
    <?xml version="1.0" 
     DB<137> 

Я имею в виду, разве это не смешно? он должен был просто вывести значение $ riz no? Который, как вы видите, отличается от того, что показано. Кроме того, как m /.*/ не будет действительным регулярным выражением?

+0

Можете ли вы показать $ riz, пожалуйста? –

+0

Какова стоимость $ riz ??? – Ben

+1

Если $ riz не соответствует, то '$ &' не изменяется. –

ответ

1

perldebug говорит, что это

Любая команда не распознается отладчик непосредственно выполняется (Эвальд) в качестве кода Perl в текущем пакете.

Обратите внимание, что указанный eval связан неявным объемом. В результате всякая потерявшаяся после eval новая лексическая переменная или любой модифицированный буфер захвата теряется. Отладчик - хорошая среда для . Изучите Perl, но если вы интерактивно экспериментируете с материалом, который должен быть в том же объеме, введите его в одну строку.

Так и т.д. переменные $& и $1 локализованы во время выполнения команды отладчика, и потеряли одного команда выполнена.

Вы можете использовать

$riz =~ m{url=(.*?)Support}; print $&, "\n"; print $1, "\n"; 

или

$riz =~ m{url=(.*?)Support}; ($and, $one) = ($&, $1); 
p $and 
p $one 

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

+0

спасибо, это, наконец, по крайней мере решает часть моей проблемы –

+0

Так же, как обновление, это было 100% проблемой, из-за которой все не работало. Да, мое регулярное выражение могло иметь ошибки, но они выглядели по-другому. Как только я правильно написал команды отладчика, все остальное было очень просто. +20 указывает на Бородина –

+1

Очень связанный только с дней назад: [Почему не eval '/ (...) /' set $ 1?] (Http://stackoverflow.com/questions/10909127/perl-why-doesnt- Eval-ние-1) – daxim

2

$& обновляется всякий раз, когда есть успешный матч. Если совпадение не выполняется, то $& не обновляется и сохраняет прежнее значение. См. Переменную $MATCH в perlvar. (perldoc perlvar и найти $MATCH)

1

Это прекрасно. $& содержит строку, которая соответствует последним регулярное выражение. Я предполагаю, что содержимое $riz не содержит соответствия для /href=(.*artist?)/. Вы должны проверить возвращаемое значение совпадения регулярных выражений.

Вы знаете, что /artist?/ будет соответствовать только artist или artis?

Смежные вопросы