IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Explication sur tout petit script


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 161
    Points : 78
    Points
    78
    Par défaut Explication sur tout petit script
    Bonjour,

    Je suis en train de paramétrer squid.

    J'ai un redirector en perl que je ne comprend pas du tout (récupérer sur le net).

    Pourriez-vous me l'expliquez ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/perl
    use strict;
     
    $|=1;
    while(<>) {
            s@http://([a-z]+\.)+([a-z])+@http://www.monsite.com@;
            print;
    }
    L'idée est de rediriger tous les users qui tape une adresse internet vers http://www.monsite.com.

    Ca fonctionne très bien mais je voudrais autoriser également l'accès à www2.monsite.com malheureusement si je le tape vous avez devinez je suis rediriger vers www.monsite.com.

    Auriez-vous une idée pour optimiser ce script vers cet objectif ?

    Ou m'expliquez le traitement des chaines de caractères ?

    Merci.

    Fluxy__

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    il me semble qu'il faut faire un test sur $_, genre un if, avant de renvoyer, qui vérifie si l'adresse passée est bien différente de www2.monsite.com :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(<>) {
    if(!$_  =~ /www2.monsite.com/)
          {
            s@http://([a-z]+\.)+([a-z])+@http://www.monsite.com@;
            print;
          }
    }
    Je garantis pas sur facture, PERL est un peu nouveau pour moi aussi...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 161
    Points : 78
    Points
    78
    Par défaut
    Non effectivement ca ne marche pas.


    Une autre idée ?

    ++

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il suffit de faire ce que t'as suggéré Hugo, simplement il faut tout de même réimprimer l'adresse non-modifié parce que c'est cette impression que squid utilise pour rediriger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl
    use strict;
     
    $|=1;
    while(<>) {
      s{\bhttp://([a-z]+\.)+([a-z])+}{http://www.monsite.com}
        unless m{\bhttp://www2\.monsite\.com};
      print;
    }
    En bref mon code veut dire : remplacer le domaine dans l'URL sauf si le domaine est déjà www2.monsite.com .

    Si tu veux mieux comprendre ce code, il va falloir que tu apprennes à utiliser des regexps, le top pour ça c'est le livre de Friedl chez O'Reilly, si tu as les moyens n'hésite pas, les regexps sont vraiment très utiles partout !

    Si le code ci-dessus ne marche pas, essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl
    use strict;
     
    $|=1;
    while(<>) {
      s{http://([a-z]+\.)+([a-z])+}{http://www.monsite.com}
        unless m{http://www2\.monsite\.com};
      print;
    }
    Mais c'est un peu moins "sûr".

    --
    Jedaï

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 161
    Points : 78
    Points
    78
    Par défaut
    Je te remercie pour ta réponse.

    Je n'ai pas encore tester.

    Par contre il me semblait que le "prototype" de remplacement en perl était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s/pattern/remplacement/g
    (g pour toutes les occurrences)

    Je ne comprend pas pourquoi les séparateurs dans le code que j'ai transmit sont des "@" et pourquoi toi tu met des "{ }" ou "{\b }" ? Peux-tu m'expliquer ?

    Autre question :

    Le "s" correspond sûrement à substitute mais à quoi correspond le "m" ?

    ++

  6. #6
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    En ce qui concerne les @ à la place des /, l'explication est très simple : en Perl, on peut choisir les délimiteurs que l'on veut pour les regex ! Ici, on fait des tests sur une url, qui donc contient beaucoup de /, utiliser ce caractère comme délimiteur serait une bien mauvaise idée, d'où l'utilisation de l'arobase (mais on aurait tout aussi bien mettre des * ou des | ). C'est la même explication pour les {}.

    En ce qui concerne le m, il signifie match. En fait, si le motif est reconnu, m retournera une valeur vraie, sinon une fausse (en tout cas en contexte scalaire, c'est plus compliqué en contexte de liste, mais cela ne nous concerne pas ).

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Fluxy
    Je ne comprend pas pourquoi les séparateurs dans le code que j'ai transmit sont des "@" et pourquoi toi tu met des "{ }" ou "{\b }" ? Peux-tu m'expliquer ?
    Woufeil t'a bien expliqué, mais pour mieux te convaincre de l'intérêt de cette fonctionnalité ici, je te montre ce à quoi ça ressemblerait sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      s/\bhttp:\/\/([a-z]+\.)+([a-z])+/http:\/\/www.monsite.com/
        unless m/\bhttp:\/\/www2\.monsite\.com/;

    (personnellement je n'aime pas trop utiliser le @ parce qu'on risque la confusion avec un tableau lorsqu'on jette un coup d'oeil superficiel, et que ça peut compromettre la colorisation avec certains coloriseur de mauvaise qualité (à leur décharge, Perl est un langage très difficile à parser))

    Le \b n'est pas un délimiteurs, il fait partie de la regex, il indique une "frontière de mot", autrement dit le passage d'un caractère non-mot (ou d'une absence de caractère en bord de string) à un caractère mot (alphanumérique disons). Disons qu'ici ils m'apportent un peu plus de tranquillité d'esprit.

    --
    Jedaï

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 161
    Points : 78
    Points
    78
    Par défaut
    Je vous remercie pour votre explication.

    Vous souhaitant un agréable week-end.

    Je ne manquerais pas de vous signaler si le script fonctionne, je n'ai pas eu le temp de tester.

    ++

    Fluxy

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 161
    Points : 78
    Points
    78
    Par défaut
    Ca fonctionne avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/perl 
    use strict;   
    $|=1; 
    while(<>) {  s{http://([a-z]+\.)+([a-z])+}{http://www.monsite.com}  
    unless m{http://www2\.monsite\.com}; 
    print; 
    }
    Encore une fois merci.

    Le seule problème est la regex qui ne doit pas être complète.

    En effet si je tape http://www.google.fr/params=toto, il me revoit la page est introuvable.

    Connaissez-vous une regex plus adaptée.

    Bonne journée.

Discussions similaires

  1. Un tout petit script génant
    Par neutrall dans le forum Linux
    Réponses: 13
    Dernier message: 07/02/2010, 20h31
  2. Une Condition If Sur Un Petit Script
    Par The_Haunted dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/09/2008, 22h29
  3. explications sur un petit code
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 27/04/2007, 17h03
  4. explication sur un petit programme ?
    Par seb9999 dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo