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 :

[langage] Supprimer un élément dans une liste


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut [langage] Supprimer un élément dans une liste
    Bonjour,

    J'ai une liste @tab et je voudrais supprimer un élément précis de cette liste, mais qui peut être situé n'importe où dedans.
    J'ai cherché et je n'ai trouvé que des fonctions qui retirent le premier élément, ou le dernier.. je ne peux pas croire qu'il n'y avait pas de fonction qui fasse ça, et qui s'écrive un truc comme
    qu'en dites vous ?
    merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    A ma connaissance, il n'y a malheureusement pas de fonction capable de faire ce que tu veux, mais qu'importe, essaie celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub Delete_Tab
    {
        my $Position = shift;
        my @OldTab = @_;
        my @NewTab;
     
        for (my $i = 0; $i < scalar(@OldTab); ++$i)
        {
            push(@NewTab, $OldTab[$i]) if ($i != $Position);
        }
     
        return @NewTab;
    }
    Exemple d'utilisation : tu as une liste @Liste contenant (1, 2, 3, 4, 4) et tu veux supprimer le second "4" indicé en position 4 de la liste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Liste = Delete_Tab(4, @Liste);
    @Liste devrait contenir désormais (1, 2, 3, 4).

    A essayer !

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Ok merci
    Et pour avoir la taille d'une liste ? (le nombre d'éléments)
    En fait je veux tester si la liste est vide...

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par myjuna
    Ok merci
    Et pour avoir la taille d'une liste ? (le nombre d'éléments)
    En fait je veux tester si la liste est vide...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (! @Liste)
    {
        print "la liste est vide";
    }
    else
    {
        print "la liste contient ", scalar(@Liste), " éléments";
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Heu... ce code ne fonctionne pas chez moi!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unless (! @tab)
    { ... }
    n'est jamais réalisé alors que ma liste est assurement vide.

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "taille : scalar(@tab)\n" ;
    m'affiche :
    ???

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    unless (! @tab) signifie grosso modo tant que ma liste n'est pas vide, faire ce qui suit ---> est-ce bien ce que tu veux faire ?

    Quant à ton 2è pb, remplace print "taille : scalar(@tab)\n" ; par print "taille : ", scalar(@tab), "\n" ;, tu verras mieux le résultat

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Oui c ça, en fait je veux réaliser une action à moins que ma liste ne soit vide. or là ça ne réalise pas mon action, bien que ma liste soit vide ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unless (! @tab_UnEther)
    {
       $tab_Etherchannel{$1} = \@tab_UnEther ;
    }
    ok pour le scalar

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Arioch
    my $Position = shift ;
    à propos que fait "SHIFT" ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 68
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par myjuna
    à propos que fait "SHIFT" ?
    Ca sert à prendre le premier paramètre que tu as passé à ta fonction.
    SHIFT enlève en fait le 1er élément du tableau @_.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fonction($param1,$param2,$param3);
     
    sub fonction{
                my param1 = shift;
                my param2 = shift;
                my param3 = shift;
    }

    L'autre manière de faire est de récupérer tes paramètres à partir de la variable $_[x].
    Ce n’est pas parce que les choses sont difficiles que nous n’osons pas ; c’est parce que nous n’osons pas qu’elles sont difficiles.
    Sénèque

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Ok ça marche en fait, le pb venait d'ailleurs
    Merci à tous les 2 pour vos explications!

  11. #11
    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
    Euhh, on peut faire ça en une seule opération, vous savez.... Ca s'appelle un slice ou une "tranche" en français. Ca permet de faire un tableau qui ne contient qu'une partie des éléments d'un autre tableau, par exemple pour supprimer un élément d'un tableau disons @tableau, et l'élément d'indice $i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @tableau = @tableau[0..($i-1),($i+1)..$#tableau];
    Marche pour tout indice (y compris le début et la fin du tableau).

    Evidemment l'outil "slice" est beaucoup plus puissant et peut servir à beaucoup d'autres choses. (Pauvre Perl s'il était incapable de faire un truc aussi simple...)
    --
    Jedaï

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Ca marche super bien!
    merci!!

    Severine

  13. #13
    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
    Quelqu'un a apparemment retrouvé cette discussion récemment et m'as posé une question par PM. J'en profite donc pour signaler que la solution standard pour éliminer un élément à l'indice $i d'un tableau Perl est plus probablement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    splice @tableau, $i, 1;
    Code que je soupçonne d'être également bien plus efficace (je n'ai pas eu le temps de faire un benchmark).

    --
    Jedaï

  14. #14
    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
    Je confirme, sur un petit benchmark, c'est 600x plus rapide avec splice
    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

  15. #15
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    600 fois plus rapide! Fichtre, ça c'est de l'optim.

  16. #16
    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
    Selon la taille des tableaux, j'ai pu faire varier de 20x à plus de 2000x
    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. [MySQL] Supprimer la répitition des résultats identiques dans une liste déroulante
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 13/03/2008, 17h33
  2. supprimer un item d'un jcombobox dans une jtable
    Par bellout dans le forum Composants
    Réponses: 6
    Dernier message: 22/06/2006, 16h06
  3. supprimer le contenu d'un champ dans une table paradox
    Par ouldfella dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2006, 13h24
  4. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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