Rechercher : dans
Par :

[PERL] boucle tableau

Dernière réponse le 30 jui 2008 à 16:26:28 wafa_o, le 23 jui 2008 à 15:00:47 
 Signaler ce message aux modérateurs

Bonjour,

Je suis débutante en perl et je rencontre beaucoup de difficultés. Je souhaite creer un parcours de graphe en perl. J'ai un fichier de config. Je place chaque ligne du fichier dans un tableau t1. Puis je place chaque caractère de chaque ligne dans un tableau t2. Si je trouve le caractère "m", le caractère suivant doit etre "a".
Le problème c'est lorsque "m" est à la ligne 1 et le "a" à la ligne 2. Je ne sais pas comment ecrire : si "m" est le dernier caractère de la ligne je regarde le premier caractère de la ligne suivante.

Voilà mon code
for ( 0 .. $#t1) { $i = $_ ;
my @t2 = split (// , $t1[$i]) ;

for ( 0 .. $#t2 ) {
$j=$_
if ($t2[$j] =~ /m/) {
print "on a trouvé m; on cherche a\n" ;
$IdxCaractereDeLaLigne = ++$IdxCaractereDeLaLigne;
if ($tableauCaractere[$IdxCaractereDeLaLigne] =~ /'[a-zA-Z0-9]+'/) {
print "on a trouvé a\n" ;
}
else { print "il faut regarder la ligne suivante\n";
next;
}
}

if ($tableauCaractere[$IdxCaractereDeLaLigne] =~ /'[a-zA-Z0-9]+'/) {
print "on a trouve a dans la ligne suivante\n" ;
}
else {
print "ERREURRR! le m n'est pas suivi par a \n";
}
}
}




Merci d'avance.

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [PERL] boucle tableau » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Firefox bloque les boucles de redirection VoirProblème Comment faire pour que Firefox tienne compte des boucles de redirection ? Solution La configuration de Firefox limite parfois le nombre de redirection enchainées, ce qui génère cette erreur. Pour ne pas avoir ce problème il faut modifier...
Perl - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
VBScript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (VBScript associe le mot clé true à...
PHP - Les classes VoirLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la...

1

lami20j, le 23 jui 2008 à 23:55:54

Salut,

Je ne sais pas comment ecrire : si "m" est le dernier caractère de la ligne je regarde le premier caractère de la ligne suivante.


je ne pense pas que le problème est bien posé.

en fait, tu n'as plus des lignes mais des éléments des 2 tableux
donc la question sera quand le dernier caractère de la chaîne qui se trouve à l'index I est m alors je pense à l'élément suivant du tableau celui qui se trouve à I+1 et je vérifie que la 1ère lettre de la chaîne est a

a vrai dire je ne comprends pas ce que tu veux

si tu nous donneras ton fichier de config (donc ce que tu as en Entrée) et tu nous donneras un exemple de ce que tu veux obtenir en Sortie, peut être qu'on trouveras ensemble une solution ;-) 106485010510997108

Répondre à lami20j

2

wafa_o, le 24 jui 2008 à 09:13:20

Salut lami20j,

Il est possible que j'ai mal expliqué ce que je souhaitais. Je suis débutante.
Pour répondre à ta question le fichier en entré est de la forme :

my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] } );

Le but est de vérifier la syntaxe. Après { je dois trouver '.
Après my%[a-z]+ on doit trouver =>
Après ' je peux trouver , ou ] etc.

Est ce que tu comprends mieux l'exercice ?

Répondre à wafa_o

3

lami20j, le 24 jui 2008 à 12:50:29

Salut,

en bref tu veux faire quelque chose pour analyser si la syntaxe est correcte si j'ai bien compris.
je pense qu'une solution avec les regex peut être faisable
je vais voir ça ce soir ;-) (je suis au boulot et je n'ai pas le temps) 106485010510997108

Répondre à lami20j

4

wafa_o, le 24 jui 2008 à 12:58:53

Oui c'est bien celà.
En ce moment je tente avec les hashs.

Merci lami20j. Bonne après midi.

Répondre à wafa_o

5

lami20j, le 24 jui 2008 à 21:37:10

Salut,

voici un exemple

#!/usr/bin/perl
use strict; use warnings;

while(<DATA>){
        print "$. ok\n" if /{\s*'\w+'\s*=\>\s*\[\s*('\w+',)*\s*'\w+'\s*]\s*}/;
}
__END__
my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] } );
my %toto => ( 'AAAAAA' =>{ uuu' => [ 'toto','tata', 'mouloud' ] } );
my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] } );
my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud'  } );

106485010510997108

Répondre à lami20j

6

wafa_o, le 25 jui 2008 à 09:10:24

Salut,

A quoi correspondent les w+ ?

Répondre à wafa_o

7

lami20j, le 25 jui 2008 à 09:26:00

Salut,

\w répresent un caractère mot qui peut être a à z ou A à Z ou 0 à 9 ou _ (underscore)

+ c'est un quantificateur qui permet de reconnaître un caractère minimum et maximum combien la mémoire permet ;-)

en fait \w+ correspond à la clase de caratères [a-zA-Z0-9_]+
donc où t'écrit \w+ tu peux écrire [a-zA-Z0-9_]+
106485010510997108

Répondre à lami20j

8

wafa_o, le 29 jui 2008 à 08:47:00

Merci.

Répondre à wafa_o

9

wafa_o, le 30 jui 2008 à 11:39:01

Bonjour,

Je reviens à mon problème de départ :
si "m" est le dernier caractère de la ligne je regarde le premier caractère de la ligne suivante.

Comme l'a bien compris lami20j, j'ai des éléments de 2 tableaux.
" la question sera quand le dernier caractère de la chaîne qui se trouve à l'index I est m alors je pense à l'élément suivant du tableau celui qui se trouve à I+1 et je vérifie que la 1ère lettre de la chaîne est a".

Quelqu'un a une idée ?
Merci d'avance.

Répondre à wafa_o

10

lami20j, le 30 jui 2008 à 13:45:00

Salut,

quand tu écris

for ( 0 .. $#t1) { $i = $_ ; my @t2 = split (// , $t1[$i]) ; 

for ( 0 .. $#t2 ) { 

quelque soit les conditions tous les éléments des tableaus sont parcourus de la façon suivante

Pour chaque élément de @t1

   Traite les éléments de @t2
Je pense qu'il faut faire autrement ;-)

Je vais regarder ce soir

106485010510997108

Répondre à lami20j

11

wafa_o, le 30 jui 2008 à 14:11:51

Merci lami20j.

Mais est ce que tu comprends bien ce que je souhaite faire ?

Répondre à wafa_o

12

lami20j, le 30 jui 2008 à 14:41:41

Re,

si j'ai bien compris tu souhaites vérifier la syntaxe
toutefois ta demande se référe à une seule ligne

y a-t-il plusieurs lignes?!
peut être que la connaissance de ton fichier de traitement sera utile
si tu as des précisions à faire, alors c'est le moment ;-) 106485010510997108

Répondre à lami20j

13

wafa_o, le 30 jui 2008 à 15:06:58

Le fichier comporte plusieurs lignes.
Comme je te l'avais dit, il est de la forme :
my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] } );

mais il peut s'ecrire
my %toto => (
'AAAAAA' =>{
'uuu' => [ 'toto','tata', 'mouloud' ] } );

ou


my %toto => (
'AAAAAA' =>{
'uuu' => [
'toto',
'tata', 'mouloud' ] }
);

ou
m
y %toto => (
'AAAAAA' =>{
'uuu' => [
'toto',
'tata', 'mouloud' ] }
);


etc...

Pour celà, j'ai donc placé chaque ligne de mon fichier dans un tableau @tabL, puis chaque caractère de chaque ligne de un tableau @tabC. J'enleve tous les espaces, retours chariot, tabulation...

Puis j'essai de faire le traitement.

while ($_ <= $#tabC) {
if ( $tabC[$_] =~ /m/ ) {
LE PROBLEME SE SITUE ICI ***
if ($tabC[++$_] =~ /y/) {
if ($tabC[++$_] =~ /%/) {
print "OK\n";
}
}
}
$_++;
}


**** LE PROBLEME SE SITUE ICI : Je m'explique à nouveau. si le y est à la ligne suivante, la boucle sera terminée.
je voudrais rajouter une condition à savoir, si le caractère m est le dernier caractère de la ligne, il faut passer au premier caractère de la ligne suivante.

En espèrant avoir été assez claire, je te souhaite une bonne après midi

Répondre à wafa_o

14

wafa_o, le 30 jui 2008 à 15:22:48

Autre précision, il y a plusieurs lignes du type que je t'ai donné.
Par exemple:

my %toto => (
'AAAAAA' =>{
'uuu' => [ 'toto','tata', 'mouloud' ] }



'BBBBB' =>{
'SSS' => [
't',
'ta',
'mod'
]
}

);

Répondre à wafa_o

15

lami20j, le 30 jui 2008 à 15:39:07

Re,

en ce cas, je me pose une question bête ;-)

il ne sera mieux d'arranger un peu ton fichier avant de le traiter?!


par exemple transformer tout dans de lignes de genre

my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] }, 'BBBBB' =>{ 'SSS' => [ 't', 'ta', 'mod' ] } );


comme ça ça sera plus facile de traiter 106485010510997108

Répondre à lami20j

16

wafa_o, le 30 jui 2008 à 15:45:01

Ah, tu viens de me donner une idée. Je vais créer un fichier temp. Je te tiens au courant.

Répondre à wafa_o

17

 wafa_o, le 30 jui 2008 à 16:26:28

Merci lami20j. J'ai la réponse à mon problème en une seule ligne.

Je souhaitais te poser une question, tu travailles dans quel domaine? l'informatique je suppose non?

Répondre à wafa_o