Chercher element dans un tableau

Chercher element dans un tableau - Perl - Programmation

Marsh Posté le 14-12-2005 à 22:04:37    

Bonjour à tous ,
 
J'aimerais chercher un élément dans un tableau .
Si cet élement est trouvé alors je sorts de la boucle et je ne fais rien.
Si cet élement n'est pas trouvé une fois avoir chercher dans tout le tableau alors j'execute une commande.
J'ai essayé avec un foreach $var (@mon tableau) mais ca ne fonctionne pas car si $var n'est pas l élément que je cherche alors il execute la commande! alors que je ne veux éxecuter cette commande qu'une seule fois...
je pensais passer par une variable intermediaire, ou un while, until?  
Merci d'avance de votre aide.  
Junt

Reply

Marsh Posté le 14-12-2005 à 22:04:37   

Reply

Marsh Posté le 15-12-2005 à 06:13:13    

my $trouve;
my $elem;
 
foreach $elem (@montableau) {
 $trouve = ($elem eq "truc a chercher" );
 continue if $trouve;
}
-execute la commande- if $trouve;

Reply

Marsh Posté le 15-12-2005 à 07:14:11    

Junt a écrit :

Si cet élement est trouvé alors je sorts de la boucle et je ne fais rien.
Si cet élement n'est pas trouvé une fois avoir chercher dans tout le tableau alors j'execute une commande.


 

if ( scalar(grep(/truc à chercher/, @tableau)) )
{
   # exécuter la commande voulue
}


Message édité par Elmoricq le 15-12-2005 à 07:14:43
Reply

Marsh Posté le 15-12-2005 à 11:26:06    

regarde la doc sur la fonction next et last
sinon voilà :

Code :
  1. foreach my $case (@montableau) {
  2.    if ($case eq "truc a chercher" ) {
  3.         last;
  4.    }
  5. }

Reply

Marsh Posté le 15-12-2005 à 14:36:26    

Elmoricq je pense est la mieux...

Reply

Marsh Posté le 15-12-2005 à 14:56:34    

il est formellement recommandé par larry wall (createur de perl) de pas utiliser les grep lorsqu'on ne recupere pas de resultat et il conseil de faire un foreach.
 

Code :
  1. Évitez d'utiliser grep() (ou map()) ou des « backticks » (`) dans un contexte vide, c'est-à-dire, quand vous ne récupérez pas les valeurs qu'elles retournent. Ces fonctions retournent toujours des valeurs alors, utilisez-les. Sinon, utilisez une boucle foreach() ou l'appel system() à la place.

Reply

Marsh Posté le 15-12-2005 à 15:05:02    

bioinfo_djib a écrit :

il est formellement recommandé par larry wall (createur de perl) de pas utiliser les grep lorsqu'on ne recupere pas de resultat et il conseil de faire un foreach.


 

if ( join("#", @tableau) !~ /truc à chercher/ )
{
    # exécuter la commande
}


 
 
(c'est juste pour embêter mon monde, je ne crois pas judicieux d'utiliser cette méthode sur de gros tableaux [:ddr555] )


Message édité par Elmoricq le 15-12-2005 à 15:05:35
Reply

Marsh Posté le 15-12-2005 à 16:34:14    

Bonjour,
 
Tout d'abord merci à tous pour vos réponses.
 
si je prends ton code bioinfo_djib, ce n'est pas tout à fait ce que je veux  
Code :
foreach my $case (@montableau) {
   if ($case eq "truc a chercher" ) {
        last;
   }
}
car si je ne trouve rien que se passe t'il?  je ne peux pas faire un else dans la boucle foreach car sinon ma commande va être éxecutée autant de fois qu'il y a de $case  alors que je veux qu'elle soit exécuter qu'une seule fois. Sinon le last marche bien pour quitter la boucle.
 
Ce soir, je vais tester les solutions de Elmoricq, je n'ai pas encore eu le temps.
 
 
En faite j'ai essayé de contourner le problème hier soir en passant par un tableau associatif et l'utilisation de exists.
=== il y a du code avant==
 
@ls = ( ma premiere liste)
$i ='0';
%list_search = ();
foreach $entry (@ls )
{
recuperation de donnees et je veux recuperer le contenu de $valueString
 
$list_search{$valueString} = $i;
}
 
      if ( exists $list_search{"letruc que je cherche}}) {
            print "c'est Deja present \n";
            }else {
            system (J'execute ma commande});
            print "Commande executée \n";
            }
et je n'ai pas le problème de boucle et la commande ne s'execute bien qu'une seule fois
 
Mais si je me heurte à un bug je serais vers où regarder next, last, grep.
Merci :)
Junt

Reply

Marsh Posté le 15-12-2005 à 16:44:53    

use List::Util "first";
 
my $first = first {$_ eq "truc à chercher"} @liste;
 
unless ($first) {
...
}
 
 
first fonctionne comme grp sauf qu'il stop à la premiere occurence vraie.
Il est implementé en C et List::Util fait partie du CORE de perl, donc aucune raison de ne pas l'utiliser


Message édité par pospos le 15-12-2005 à 16:45:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed