Pregunta

Me estoy enseñando a mí mismo Perl y aprendo mejor con el ejemplo. Como tal, estoy estudiando un script de Perl simple que raspa un blog específico y me he confundido sobre un par de declaraciones regex. El script busca los siguientes fragmentos de HTML:

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

y aquí está el script de ejemplo que estoy estudiando:

#!/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));
}
}

Si tiene un momento para ayudarme a comprender mejor, mis preguntas son:

  1. cómo funciona la siguiente línea:

    ([^ "] *) # Nombre del ancla

  2. cómo funciona la siguiente línea:

    ([^ >] *) # Título de la publicación

  3. ¿qué significa el " seis " significa en la siguiente línea:

    </dd>/six)

¡Muchas gracias de antemano por toda su ayuda! También estoy investigando las respuestas a mis propias preguntas en este momento, ¡pero esperaba que alguien me diera un impulso!

¿Fue útil?

Solución

  

cómo funciona la siguiente línea ...

     

([^ "] *) # Nombre del ancla

cero o más cosas que no son " ;, capturadas como $ 1, $ 2 o lo que sea, dependiendo de la cantidad de paréntesis (en el que estamos.

  

cómo funciona la siguiente línea ...

     

([^ >] *) # Título de la publicación

cero o más cosas que no son > ;, capturadas como $ 1, $ 2 o lo que sea.

  

¿qué significa el " seis " significa en el   línea siguiente ...

     

< / dd > / six)

  • s = coincidir como una sola línea (esto solo significa que ". " coincide con todo, incluyendo \ n, lo que de otro modo no haría)
  • i = coincide con mayúsculas y minúsculas
  • x = ignorar espacios en blanco en expresiones regulares.

x también hace posible poner comentarios en la expresión regular en sí, por lo que cosas como # Post title son solo comentarios.

Consulte perldoc perlre para obtener más / mejor información. El enlace es para Perl 5.10. Si no tiene Perl 5.10, debería consultar el documento de Perlre para su versión de Perl.

Otros consejos

  1. [^"]* significa " cualquier cadena de cero o más caracteres que no contiene comillas " ;. Esto está rodeado de comillas que forman una cadena entre comillas, del tipo que sigue a <a name=
  2. [^>]* es similar a lo anterior, significa cualquier cadena que no contenga >. Tenga en cuenta aquí que probablemente quiera decir [^<], para que coincida hasta la apertura < para la siguiente etiqueta, sin incluir la apertura real.
  3. es una colección de banderas de expresiones regulares específicas de php. Sé que i significa mayúsculas y minúsculas, no estoy seguro del resto.
  1. El código es una expresión regular extendida. Le permite poner espacios en blanco y comentarios en sus expresiones regulares. Consulte perldoc perlre y perlretut . De lo contrario, como es normal.

  2. Same.

  3. Los caracteres son modificadores de expresiones regulares .
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top