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 :

Filtre des éléments d'un array


Sujet :

Langage Perl

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut Filtre des éléments d'un array
    Bonjour, je récupère une liste de fichiers avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @Liste_fichiers = `ls -1t *_blabla_??????*.log`
    je récupère donc par exemple les éléments suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    path_file/A_blabla_20131218.log
    path_file/B_blabla_20131218.log
    path_file/C_blabla_20131218.log
    path_file/A_blabla_20131217.log
    path_file/B_blabla_20131217.log
    path_file/C_blabla_20131217.log
    Je souhaiterais ne garder que la 1ère occurrence de A, B et C (sachant que pour le moment il n'y en a que 3 mais que ce nombre peut évoluer et doit être pris en compte pour éviter un redéveloppement)

    Auriez-vous une solution beaucoup moins moche que de faire une vérification élément par élément en ne gardant que la 1ère fois où on trouve le fichier commencant par A,B C...

    D'avance je vous remercie pour votre aide

  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
    Par 1er élément, tu veux dire que l'ordre à prendre en compte :
    1- est l'ordre dans le tableau après récupération de la sortie de ls
    2- est l'ordre alphabétique des fichiers ? (qui peut différer si la commande ls est modifiée pour retourner les fichiers dans un autre ordre).

    Une solution est d'utiliser un hash rempli avec la partie du nom qui exclue la partie variable (la date).

    Avec une version de perl 5.10 :
    Si c'est 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    my @Liste_fichiers = qx(ls -1t *_blabla_??????*.log);
    my %f;
    say $_ foreach grep !$f{s/_(\d{8})\./\./r}++, @Liste_fichiers;
    Si c'est 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    my @Liste_fichiers = qx(ls -1t *_blabla_??????*.log);
    my %f;
    say $_ foreach grep !$f{s/_(\d{8})\./\./r}++, sort @Liste_fichiers;
    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
    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
    Une solution est d'utiliser un hash rempli avec la partie du nom qui exclue la partie variable (la date).
    ++, même avis.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    merci Philou je vais tester

    par contre, j'ai pas mis les contraintes techniques:
    - perl v5.8.4
    - je dois faire avec les fonctions/packages/modules de base de perl

    simple non?

  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
    A priori, le seule changement imposé par ta version de Perl est que la fonction say n'existe pas en 5.8 et que tu dois la remplacer par un print avec éventuellement l'ajout d'un "\n".

  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
    Non, il faut aussi supprimer le modificateur /r dans l'expression régulière, et du coup, à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    say $_ foreach grep !$f{s/_(\d{8})\./\./r}++, sort @Liste_fichiers;
    écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$_\n" foreach grep { my ($root = $_) =~ s/_(\d{8})\./\./; !$f{$root}++ } sort @Liste_fichiers;
    La contrainte de n'utiliser que les modules du Core n'est pas impactante.
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    oui j'avais fait le changement du say et enlevé le 'r'

    Philou ta dernière proposition ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't use global $_ in "my" at ./bin/tq_XXX.pl line 116, near "= $_"

  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
    Désolé, j'ai pas testé avant de poster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$_\n" foreach grep { (my $root = $_) =~ s/_(\d{8})\./\./; !$f{$root}++ } sort @Liste_fichiers;
    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
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    ok merci

  10. #10
    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
    Non, il faut aussi supprimer le modificateur /r dans l'expression régulière ...
    Ah oui, je n'avais pas fait gaffe. En plus je pensais que le modificateur /r avait été introduit plus tard (au hasard, j'aurais dit 5.12 ou 5.14).

  11. #11
    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
    Tu as raison, /r introduit en 5.14 (perldoc perl5140delta)
    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

  12. #12
    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
    Et ça marche avec 'use feature qw(:5.10);' ?

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

Discussions similaires

  1. Filtre des éléments d'un array
    Par 6ril23 dans le forum Langage
    Réponses: 4
    Dernier message: 19/12/2013, 10h08
  2. Somme des éléments de mon array
    Par aitiahcene dans le forum Langage
    Réponses: 11
    Dernier message: 30/04/2013, 15h42
  3. Jsdoc, type des éléments d'un Array
    Par dukej dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/01/2011, 00h05
  4. Affichage des éléments d'un array
    Par L'aigle de Carthage dans le forum Langage
    Réponses: 5
    Dernier message: 06/05/2008, 10h35
  5. [DOM] Placer des éléments du DOM dans un array()
    Par strat0 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/08/2007, 15h06

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