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 :

Plusieurs substitution dans une même chaîne de caractères


Sujet :

Langage Perl

  1. #1
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut Plusieurs substitution dans une même chaîne de caractères
    Bonjour,
    Est il possible de faire plusieurs substitutions dans une même chaîne de caractères en une ligne ?

    Exemple:
    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $format_date = "jj-mm-aaaa";
    $annee = "2009";
    $jour = "03";
    $mois = "06";
    et je veux afficher la date : 03-06-2009, sachant que ça doit marcher quelque soit le séparateur de date (jj/mm/aaaa affichera 03/06/2009 etc.) et quelque soit l'ordre des valeurs (aaaa-jj-mm affichera 2009-03-06).
    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date=~ s/aaaa/$annee/&&s/mm/$mois/&&s/jj/$jour/;
    Mais ça ne marche pas (je sais même pas ce que perl comprend).

    Je veux le faire en une ligne.
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $date=~ s/aaaa/$annee/;
    $date=~ s/mm/$mois/;
    $date=~ s/jj/$jour/;
    Marche très bien.

    Une suggestion ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date=~ s/aaaa/$annee/, $date=~ s/mm/$mois/, $date=~ s/jj/$jour/;
    Mais c'est un artifice qui est équivalent à l'usage de 3 expressions séparées par des ;
    Une autre manière de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $format_date = "jj-mm-aaaa";
    $annee = "2009";
    $jour = "03";
    $mois = "06";
    my %date = ( "aaaa" => $annee, "mm" => $mois, "jj" => $jour );
     
    ($date = $format_date) =~ s/(aaaa|mm|jj)/$date{$1}/g;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    D'accord avec la première proposition c'est un artifice

    Par contre la deuxième est plutôt jolie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($date = $format_date) =~ s/(aaaa|mm|jj)/$date{$1}/g;
    Qu'est ce que perl comprend ?
    perl
    "aaaa" a été trouvé (je ne cherche pas "mm" ou "jj" je ne sais même pas qu'ils existent, le "ou" devant m'a dissuadé de regarder), je l'enregistre dans la valeur $1 (qui est ma première valeur matchée), je dois le substituer avec la valeur de la liste date correspondant à lindice $1 qui vaut "aaaa". Le g à la fin m'indique de recommencer ma recherche. Je ne trouve pas "aaaa" je cehrche et trouve "mm" ... etc.
    J'ai bon ?

    En tout cas ça me plait merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    De ce que perl comprend de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date=~ s/aaaa/$annee/ && s/mm/$mois/ && s/jj/$jour/
    Je dirais ceci :
    - perl comprends s/.../.../ comme étant un alias de $_ =~ s/.../.../ si l'opérateur s/// n'est pas précédé de =~
    donc l'expression s'écrit encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date=~ s/aaaa/$annee/ && $_ =~ s/mm/$mois/ && $_ =~ s/jj/$jour/
    Donc, cette expression ne devrait mettre à jour que l'année dans $date, et provoquera une erreur si "use warnings" est utilisé et que $_ est undef. Sinon, elle modifiera potentiellement $_.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Ok !

    Note que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date=~ s/aaaa/$annee/ && $date =~ s/mm/$mois/ && $date =~ s/jj/$jour/
    marche très bien et répond au Cdc

    Merci pour les explications en tous cas !

    --> Résolu <--

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Mmmm, non, il ne marche pas parfaitement, car si ton format ne contient pas le motif recherche, le premier opérande du && sera faux, et le suivant non évalué.
    Ainsi, si "aaaa" n'est pas inséré dans le format, aucune substitution n'aura lieu.

    Attention donc avec l'usage de && (alors qu'avec ";" ou ",", toutes les expressions régulières seront évaluées.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Arg encore un coup portée en plein coeur par Maître Philou !

    Bien vu !

    Pour ma défense je dirai que ça correspond toujours au cahier des charges initial. C'est juste que ce dernier a mal été défini...

    Ajoutons donc dans le CdC que ça doit marcher même si l'année, le mois ou le jour n'est pas renseigné.

    Mais... Qu'est qui nous empêche d'imaginer que le type qui définit le format de la date est un anglais ? Et qu'il écrit donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $format_date = "mm/dd/yy";
    (oui que deux lettres pour l'année, mais il aurait pu en mettre 4, il était pressé voilà tout)
    Bon les / sont gérés mais le dd et le yy ?

    Note à l'attention de Maître Philou : si tu résous cette énigme simplement je fais intervenir un utilisateur chinois !

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il suffit simplement de compléter la liste du hashage %date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %date = ( "aaaa" => $annee, "yy" => substr($annee, 2), "mm" => $mois, "jj" => $jour, "dd" => $jour);
     
    ($date = $format_date) =~ s/(aaaa|yy|mm|jj|dd)/$date{$1}/g;
    Je chercher encore mieux ...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour ajouter le mois anglais sur 3 lettres (abrégé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use POSIX qw(strftime);
     
    my %date = (
     "aaaa" => $annee,
     "yy" => substr($annee, 2),
     "mm" => $mois,
     "mmm" => strftime(0, 0, 0, $jour, $mois-1, $annee),
     "jj" => $jour,
     "dd" => $jour);
     
    ($date = $format_date) =~ s/(aaaa|yy|m{2,3}|jj|dd)/$date{$1}/g;
    Etc, etc, etc...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, le plus simple est sans doute d'utiliser strftime avec un format standard.
    Voir :
    man strftime
    perldoc POSIX (chercher strftime)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/02/2007, 13h20
  2. [débutant] plusieurs panels dans une même Jframe
    Par djerbafr dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 02/02/2007, 16h11
  3. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18
  4. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38
  5. [Applet]Utiliser plusieurs Applet dans une même classe
    Par BRAUKRIS dans le forum Applets
    Réponses: 5
    Dernier message: 11/06/2004, 15h27

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