Я новичок в Perl и у меня есть несколько вопросов по регулярным выражениям - PullRequest
1 голос
/ 22 октября 2009

Я учу себя Perl и учусь лучше всего на примере. В связи с этим я изучаю простой скрипт на Perl, который очищает конкретный блог и обнаружил, что запутался в паре операторов регулярных выражений. Скрипт ищет следующие фрагменты html:

 <dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
 <dd>
   <p>
     [Content]
   </p>
 </dd>
 ... and so on.

и вот пример сценария, который я изучаю:

#!/usr/bin/perl -w

use strict;
use XML::RSS;
use LWP::Simple;
use HTML::Entities;

my $rss = new XML::RSS (version => '1.0');
my $url = "http://www.linux.org.uk/~telsa/Diary/diary.html";
my $page = get($url);

$rss->channel(title       => "The more accurate diary. Really.",
          link        => $url,
          description => "Telsa's diary of life with a hacker:" 
                 . " the current ramblings");

foreach (split ('<dt>', $page))
{
if (/<a\sname="
         ([^"]*)     # Anchor name
         ">
         <strong>
         ([^>]*)     # Post title
         <\/strong><\/a><\/dt>\s*<dd>
         (.*)        # Body of post
         <\/dd>/six)
{
    $rss->add_item(title       => $2,
               link        => "$url#$1",
                   description => encode_entities($3));
}
}

Если у вас есть момент, чтобы лучше помочь мне понять, мои вопросы:

  1. как работает следующая строка:

    ([^ "] *) # Имя привязки

  2. как работает следующая строка:

    ([^>] *) # Заголовок сообщения

  3. что означает «шестерка» в следующей строке:

    / шесть)

Заранее большое спасибо за вашу помощь! Я также изучаю ответы на свои вопросы в данный момент, но надеялся, что кто-то может помочь мне!

Ответы [ 3 ]

7 голосов
/ 22 октября 2009

как работает следующая строка ...

([^ "] *) # Имя привязки

ноль или более вещей, которые не являются ", фиксируются как $ 1, $ 2 или что-то еще, в зависимости от количества скобок (у нас есть.

как работает следующая строка ...

([^>] *) # Заголовок сообщения

ноль или более вещей, которые не>, считаются как $ 1, $ 2 или что-то еще.

что означает "шестерка" в следующая строка ...

/ шесть)

  • s = совпадать как одна строка (это просто означает, что "." Соответствует всему, включая \ n, что не было бы иначе)
  • i = регистр не учитывается
  • x = игнорировать пробелы в регулярных выражениях.

x также позволяет помещать комментарии в само регулярное выражение, поэтому такие вещи, как # Post title, содержат только комментарии.

См. perldoc perlre для получения дополнительной / лучшей информации. Ссылка для Perl 5.10. Если у вас нет Perl 5.10, вам следует взглянуть на документ perlre для вашей версии Perl.

2 голосов
/ 22 октября 2009
  1. [^"]* означает «любая строка из нуля или более символов, которая не содержит кавычки». Он окружен кавычками, образующими строку в кавычках, которая следует за <a name=
  2. [^>]* аналогично приведенному выше, это означает, что любая строка не содержит >. Обратите внимание, что вы, вероятно, имеете в виду [^<], чтобы соответствовать до открытия < для следующего тега, не включая фактическое открытие.
  3. это набор специфичных для php флагов регулярных выражений. Я знаю, i означает, что регистр не учитывается, но не уверен насчет остальных.
1 голос
/ 22 октября 2009
  1. Код является расширенным регулярным выражением. Это позволяет помещать пробелы и комментарии в свои регулярные выражения. См. Perldoc perlre и perlretut . В остальном как обычно.

  2. То же самое.

  3. Символы модификаторы регулярных выражений .
...