[PERL] Test appartenance a liste

Qwerti Messages postés 166 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour a tous,

Je voudrai savoir s'il y a une commande pour tester l'appartenance a une liste/tableau :

# J'ai une liste/tableau :
my @t = ( 'element 1', 'element 2', 'element 3');

# et disons deux variables :
my $elementTRUE = 'element 2';
my $elementFALSE = 'element 4';

Et je voudrai savoir s'il existe un moyen tres compact de tester l'appartenance des
variables $elementTRUE et $elementFLASE a @t, sans avoir a ecrire explicitement la
boucle de test.

Merci d'avance pour vos reponses !
- Qwerti.
Configuration: Windows XP
Firefox 3.0

2 réponses

  1. hasterix
     
    Salut !

    Il y a une méthode simple pour faire cela : une expression régulière.

    Il suffit de savoir que l'expression "@tab" correspond à la concaténation des éléments de @tab.

    On peut alors écrire :

    $val="Valeur a chercher";
    if ( "@tab" =~ /$val/) {
    print "la valeur est dans le tableau\n";
    } else {
    print "la valeur n'est PAS dans le tableau\n";
    }

    voila !
    :-)
    2
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      "@tab" correspond à la concaténation des éléments de @tab
      Pas tout à fait.
      L'interpolation de @t donne la liste des éléments séparés par un espace (ce n'est pas une concaténation)
      Un exemple
      lami20j@debian:~$ perl vider.pl
      a b c d e f g h i j k l m n o p q r s t u v w x y z
      abcdefghijklmnopqrstuvwxyz
      lami20j@debian:~$ cat vider.pl
      #!/usr/bin/perl
      use strict;use warnings;
      
      my @t='a'..'z';
      
      # l'interpolatoin de @t
      my $elementstab="@t";
      print "$elementstab\n";
      # la concatenation des éléments de @t
      my $concatenation = join "",@t;
      print "$concatenation\n";
      __END__
      lami20j@debian:~$ perl vider.pl
      a b c d e f g h i j k l m n o p q r s t u v w x y z
      abcdefghijklmnopqrstuvwxyz
      
      Pour traiter les éléments d'une liste on utilise en général foreach ou for.
      foreach my $element(@tab){
      ....traitement...
      }
      D'autres fonction qui peuvent être utiliser : grep, map, join, pack, sort, pop, push, shift, unshift, splice
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    D'autres possibilités
    lami20j@debian:~/trash$ cat ccm_grep.pl
    #!/usr/bin/perl
    #use strict;use warnings;
    
    my @t = ( 'element 1', 'element 2', 'element 3');
    print "\@t = @t\n";
    print "\n","*" x 20,"\n\n";
    
    # affiche seulement les éléments trouvés
    my @cherche = grep{ /element\s*[24]/ } @t;
    print "Trouvés : @cherche\n";
    
    # ligne de séparation
    print "\n","*" x 20,"\n\n";
    
    # affiche les éléments trouvés et non trouvés
    for my $e('element 2', 'element 4'){
      if (grep { /$e/ } @t){
        print "$e trouvé\n";
      }else{
        print "$e non trouvé\n";
      }
    }
    
    lami20j@debian:~/trash$ perl ccm_grep.pl
    @t = element 1 element 2 element 3
    
    ********************
    
    Trouvés : element 2
    
    ********************
    
    element 2 trouvé
    element 4 non trouvé
    
    1