Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Discussion: Pb de tableau

  1. #1
    Invité de passage
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    février 2013
    Messages
    9
    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 : 9
    Points : 3
    Points
    3

    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    991
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 991
    Points : 1 946
    Points
    1 946

    Par défaut

    Une solution classique possible qui devrait marcher avec n'importe quelle version de Perl 5.:

    Code :
    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".
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  3. #3
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 255
    Points
    3 255

    Par défaut

    Pour le fun :

    Code :
    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 :
    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 :
    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é
    Using strict and warnings is good for you.

  4. #4
    Invité de passage
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    février 2013
    Messages
    9
    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 : 9
    Points : 3
    Points
    3

    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    991
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 991
    Points : 1 946
    Points
    1 946

    Par défaut

    Citation Envoyé par Philou67430 Voir le message
    Pour le fun :

    Code :
    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.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  6. #6
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 255
    Points
    3 255

    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é
    Using strict and warnings is good for you.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •