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 :

Pb de tableau


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Pb de tableau
    Bonsoir, j'ai pb avec mon prog perl et je n'arrive pas a trouver la solution. Si vous pouvez m'aider c'est sympa :
    J'ai 2 tableaux : tab1 et tab2
    tab1 :
    A
    B
    C
    D

    tab2 :
    XxxxxByyyy;123
    XxxxxCzzzz;456

    Il faut que je recherche les occurrences de toutes les valeurs de tab1 dans tab2 et lorsque je les ai trouvé je rajoute dans tab1 la valeur qui se trouve après le caractère ; de tab2 précédé de ;.
    Autrement dit il faut que tab1 soit égal a :
    tab1 :
    A
    B;123
    C;456
    D

    Je précise que les valeurs contenues dans tab1 sont unique

    Merci d'avance pour votre aide.
    JM

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Une solution classique possible qui devrait marcher avec n'importe quelle version de Perl 5.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    use strict;
    use warnings;
     
    my @t1 = qw /A B C D/;
    my @t2 = qw/ XxxxxByyyy;123 XxxxxCzzzz;456/;
    my @t3; # je préfère mettre les résultats dans un troisième tableau, quitte, à la fin, à recopier @t3 dans @t1: @t1 = @t3
     
    foreach my $item2 (@t2) {
    	foreach (@t1) {
    		if ($item2 =~ /$_\w+;(\d+)$/) {
    			push @t3, "$_;$1";
    		}
    	}
    }
    print "@t3", "\n";
    Ce qui imprime @t3:

    Maintenant, si tu es en version 5.10 ou au-delà de Perl (surtout à partir de 5.14), l'utilisation de l'opérateur "smartmatch" ~~ peut "simplifier" le code. Bien que je ne sois pas sûr que ce soit vraiment plus simple, la sémantique de cet opérateur paraît pour le moins incertaine en 5.10 et 5.12 et ne semble se stabiliser qu'avec la 5.14. En fait, je ne connais pas du tout ces versions: au boulot, nous n'avions que des 5.8 jusqu'à très récemment, nous avons une 5.10 sur l'un de nos serveurs depuis deux jours seulement, pas du tout testé ces nouvelles possibilités. A la maison, j'ai une 5.10, mais je n'ai pas utilisé cette possibilité au-delà de quelques petits tests "pour voir".

  3. #3
    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 le fun :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use strict;
    use warnings;
     
    my @t1 = qw /A B C D/;
    my @t2 = qw/ XxxxxByyyy;123 XxxxxCzzzz;456/;
     
    foreach my $t1 (@t1) { say join ";", $t1, (map $_->[1], grep $_->[0] =~ /$t1/, map { [ split ";", $_ ] } @t2) }
    (on peut aussi mettre le résultat dans @t3 en remplaçant "say" par push @t3).

    Explication :
    - on parcours le tableau @t1 et pour chaque entrée
    - on découpe tous les éléments de @t2 en deux
    - on filtre ces éléments selon que le premier sous-élément (le texte) contient la valeur de l'entrée de @t1
    - on récupère le deuxième sous-élément (le nombre après ";") que l'on concatène après l'entrée de @t1 avec ";" comme séparateur

    Avec ce code, si une entrée de @t1 est présente dans plusieurs entrées de @t2, chaque valeur numérique correspondante sera ajoutée après l'entrée de @t1.
    Exemple (depuis cygwin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ perl -E 'use strict;
    use warnings;
     
    my @t1 = qw /A B C D/;
    my @t2 = qw/ XxxxxByyyy;123 XxxxBxCzzzz;456/;
    foreach my $t1 (@t1) {
      say join ";", $t1, (map $_->[1], grep $_->[0] =~ /$t1/, map { [ split ";", $_ ] } @t2)
    };
    '
    A
    B;123;456
    C;456
    D
    Si les tableaux @t1 et @t2 sont gros, il peut être intéressant de pré-découper @t2 une seule fois à l'extérieure du foreach @t1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my @t2 = map { [ split ";", $_ ] } @t2;
    foreach my $t1 (@t1) {
      say join ";", $t1, (map $_->[1], grep $_->[0] =~ /$t1/, @t2)
    }
    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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci à Lolo78 pour son début de réponse même s'il manque dans le tableau $t3 les valeurs A et B, je m'en suis inspiré pour trouvé une solution.

    Mention spéciale à Philou67430 car ton code est vraiment optimisé !
    Je vais sûrement l'utiliser dans mon code.

    A+
    JM

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Pour le fun :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use strict;
    use warnings;
     
    my @t1 = qw /A B C D/;
    my @t2 = qw/ XxxxxByyyy;123 XxxxxCzzzz;456/;
     
    foreach my $t1 (@t1) { say join ";", $t1, (map $_->[1], grep $_->[0] =~ /$t1/, map { [ split ";", $_ ] } @t2) }
    Ou comment faire du Lisp (ou du Scheme ou de l'Haskell) en Perl.

    Beau morceau de bravoure, qui vaut bien la transformation de Schwarz pour le tri.

    Très jolie construction, même si, personnellement, je suis assez peu habitué aux langages fonctionnels et ai un peu de mal à en décortiquer le fonctionnement, ce que je regrette. Mais je suis entièrement d'accord sur le fond avec la thèse de Mark-Jason Dominus dans son livre Higher Order Perl, le langage Perl possède depuis la version 5 la plupart des points forts des langages fonctionnels (fonctions de rappel, fermetures, currification, etc.) comme Common Lisp ou Scheme. Il est dommage que l'on ne s'en serve pas plus, il est des tas de domaine où les langages fonctionnels ont vraiment beaucoup à apporter.

    Depuis une quinzaine d'années (et même un peu plus), la mode est plus à la programmation orientée objet, qui apporte beaucoup de choses, mais il est dommage à mon avis que cette mode (pas de connotation péjorative dans mon esprit quand j'emploie ici le terme mode) ait fait un peu passer au second plan la puissance de la programmation fonctionnelle, qui peut apporter une très grande expressivité sous une grande concision.

  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
    Oui, cette expression s'est bien entendu inspirée de la transformation de Schwartz, dont j'use et j'abuse

    Un grand merci à Lolo pour la référence à ce bouquin (qui n'est pas donné, ni mince à lire), mais qu'il me tente franchement d'acquérir.
    Et merci aussi pour ton commentaire qui m'a fait rechercher quelques définitions dont je connaissais l'usage mais pas le nom, comme la "curryfication".

    Sinon, j'ai adoré bosser en Lisp (Lisp of Insipide et Stupid Parenthesis... que de souvenirs) dans mon enfance d'informaticien. J'avais codé à l'école un dérivateur/simplificateur formel qui j'avais ensuite re-codé en Prolog. C'était le bon vieux temps...

    Pour ce qui est de l'objet, je vois les choses ainsi : le développement de la programmation objet s'est essentiellement fait sur la base des langages et des compilateurs, c'est à dire, l'intégration dans la sémantique des langages, d'une méthode de programmation.

    Selon moi, à la base, la programmation objet est une méthodologie, un état d'esprit. Et certains langages sans sémantique objet (ni contrôle de compilateur en ce sens) permettent cependant d'implémenter facilement quelques notions de bases de la programmation objet (encapsulation notamment, parfois l'héritage). Certes, on ne dispose pas des facilités qu'offre un vrai langage objet, mais on peut définir des processus de développement (règles de codage par exemple) qui pallient au moins en partie à cela. La programmation objet, c'est avant tout un état d'esprit.

    Mais au fil des ans, l'industrie de l'informatique en a fait une technologie, et je vois les langages objets comme des éléments, certes "sécurisant" pour des décideurs, mais aussi, très limitant (voir complexifiant, comme dans le cas de C++). Ils enferment les programmeurs dans des contraintes et des "motifs de programmation", qui brident la créativité, l'efficience, au profit (soit disant) de la réutilisabilité, de la sécurité... Je suis un peu déçu : j'ai choisi ce métier d'informaticien justement pour cet esprit inventif, mais l'industrialisation du métier force à intégrer des technologies de plus en plus haut niveau, et à rendre les programmeurs de plus en plus bêtes (et disciplinés).

    Perl 5 a su intégrer une sémantique minimaliste de programmation objet, tout en gardant la flexibilité de ses fonctions avancées. C'est pour cela qu'aujourd'hui, si je dois factoriser un développement, je n'hésite pas une seconde à faire un module avec une interface objet, trouvant cette méthode bien plus facile à réaliser que la méthode fonctionnelle (avec Exporter par exemple).

    Bon, c'est ma vision des choses, hein.
    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

Discussions similaires

  1. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51
  2. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  3. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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