Question

J'apprends moi-même Perl et j'apprends mieux par l'exemple. En tant que tel, j'étudie un script Perl simple qui racle un blog spécifique et je me suis retrouvé confus à propos de quelques déclarations de regex. Le script recherche les fragments de code HTML suivants:

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

et voici l'exemple de script que j'étudie:

#!/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 vous avez un moment pour mieux m'aider à comprendre, mes questions sont les suivantes:

  1. comment fonctionne la ligne suivante:

    ([^ "]] *) # Nom de l'ancre

  2. comment fonctionne la ligne suivante:

    ([^ >] *) # Titre du message

  3. à quoi sert le & "six &"; signifie dans la ligne suivante:

    < / dd > / six)

Merci beaucoup d'avance pour votre aide! Je cherche aussi les réponses à mes propres questions pour le moment, mais espérais que quelqu'un pourrait me donner un coup de pouce!

Était-ce utile?

La solution

  

comment fonctionne la ligne suivante ...

     

([^ "]] *) Nom de l'ancre

zéro ou plus de choses qui ne sont pas & ";", saisies sous la forme $ 1, $ 2 ou peu importe, en fonction du nombre de crochets (dans lequel nous sommes.

  

comment fonctionne la ligne suivante ...

     

([^ >] *) # Titre du message

zéro ou plusieurs choses qui ne sont pas > ;, saisies sous la forme $ 1, $ 2 ou quoi que ce soit.

  

à quoi sert le " six " dire dans le   ligne suivante ...

     

< / dd > / six)

  • s = correspond en une seule ligne (cela signifie simplement que & "; &" correspond à tout, y compris \ n, ce qui ne serait pas fait autrement)
  • i = correspondre à la casse
  • x = ignorer les espaces dans les expressions rationnelles.

x permet également de mettre des commentaires dans la regex elle-même. Il n'y a donc que des commentaires comme # Post title.

Voir perldoc perlre pour plus d'informations. Le lien est pour Perl 5.10. Si vous n’avez pas Perl 5.10, vous devriez plutôt regarder le document perlre de votre version de Perl.

Autres conseils

  1. [^"]* signifie & "toute chaîne de zéro caractère ou plus ne contenant pas de guillemet &"; Ceci est entouré de guillemets formant une chaîne de guillemets, le genre qui suit <a name=
  2. [^>]* est similaire à ce qui précède, cela signifie toute chaîne qui ne contient pas >. Notez ici que vous voulez probablement dire [^<] à faire correspondre jusqu'à l'ouverture < pour la balise suivante, sans l'ouverture réelle.
  3. c'est une collection de drapeaux d'expressions rationnelles spécifiques à PHP. Je sais que i ne tient pas compte de la casse ni du reste.
  1. Le code est une regex étendue. Il vous permet de mettre des espaces et des commentaires dans vos expressions rationnelles. Voir perldoc perlre et perlretut . Sinon, comme d'habitude.

  2. Idem.

  3. Les personnages sont des modificateurs de regex .
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top