Bonjour tlm,
j'essaie de garder dans un tableau 3 valeurs:
@tabvals=($name, $type);
$tabi[$i]=@tabvals;
Après je veux chercher, pour une valeur de i donnée, quelles sont les valeurs $name et $type qui lui correspondent?
Merci d'avance
Version imprimable
Bonjour tlm,
j'essaie de garder dans un tableau 3 valeurs:
@tabvals=($name, $type);
$tabi[$i]=@tabvals;
Après je veux chercher, pour une valeur de i donnée, quelles sont les valeurs $name et $type qui lui correspondent?
Merci d'avance
Bonjour,
Utilisez des hash et lisez notre FAQ pour comprendre comment manipuler des tableaux et des hash.
Pour poursuivre avec la solution de Djibril :
Code:
1
2
3
4
5
6
7
8
9
10 use feature qw(:5.10); my @tabvals = ( { name => "Vache", type => "Végétarien" }, { name => "Chat", type => "Carnivore" }, { name => "Ours", type => "Omnivore" }, ); foreach my $vals (@tabvals) { say join ":", $vals->{name}, $vals->{type}; } say "L'élément d'indice 2 contient : ", join ",", $tabvals[2]->{name}, $tabvals[2]->{type};
Bonjour a tous,
merci pour votre réponse,
mon probleme, c'est que j'ai deux fichiers similaires, contenant a peu pres les memes données, et je veux rechercher certains mots qui se trouvent dans le premier fichier, et les tagger dans le deuxième fichier...
La solution que j'ai trouvé c'est créer une liste des mots du premier fichier, tout en extrayant le type, en meme temps que le nom, et ensuite rechercher ces mots un par un dans le deuxième fichier pour leur attribuer le type correspondant.
Il s'agit de faire des boucles.
mais ça marche pas :( j'ai déja essayé les hash, mais j'ai toujours pas trouvé de solution...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 TAGLINE: while($line=<TAG>) { chop($line); if (($line =~ m/<gsp/) || ($line =~ m/<pers/) || ($line =~ m/<inc/) || ($line =~ m/<temps/) || ($line =~ m/<org/) || ($line =~ m/<quantité/) || ($line =~ m/<lieu/) || ($line =~ m/<constr/) || ($line =~ m/var>/)){ $name=(split(/>/,$line))[1]; $nameok=(split(/</,$name))[0]; $nameok2=(split(/</,$line))[0]; if ($nameok2 =~ /\d+/){ $nameok=$nameok2." ".$nameok; } ($type, $truc) = $line =~ /<([^> ]+)([^>]?)>/; @tabvals=($nameok, $type); $tabi[$i]=@tabvals; $i++; }else{ next TAGLINE; } $long =$tabi.length; $size = @tabi; } my $j=0; while ($linetotag=<TOTAG>){ while ($j<= $size){ if ($linetotag =~ m/@tabvals[0]/){ my ($val1,$val2)=@tabi[$j]; $j++; } } }
Précise ce qui ne marche pas. Est-ce que tes tableaux contiennent bien ce que tu veux à la fin de la lecture du premier fichier?
Remarques de style:
- utilise la fonction chomp plutôt que chop
- pour créer une nouvelle case dans un tableau utilise plutôt push ou unshift plutôt que d'itérer sur $i
- l'instruction "else{ next TAGLINE;} ne sert à rien.
- "while ($j<= $size){...$j++" il vaut mieux itérer sur le tableau avec un foreach
- oui le premier tableau contient les valeurs quand je fais print "@tabvals";
- c'est quoi la différence entre chomp et chop?
- si je fais un push, il faut faire une boucle?
Le problème c'est que je veux chercher les valeurs existants dans le premier tableau, dans un fichier.
Si je trouve une valeur dans le tableau, je continue à parcourir le fichier à la position p, et le tableau à la position t, je ne veux pas reparcourir les deux fichiers dès le début, c'est pour cela que je n'ai pas utilisé for
La fonction chop retire le dernier caractère, chomp retire le retour à la ligne qui peut utiliser 1 ou 2 caractères). Chomp est plus sûre.
Ti fu fais un push, ça ajoute directement une case au tableau, pas besoin de boucle ni de variable d'itération/
Si j'ai un tableau @tableau qui contient ("a", "b", "c"),
ajoute le "d" à la fin du tableau, ce qui donne: ("a", "b", "c", "d"). La fonction unshift fait la même chose, mais au début du tableau.Code:push @tableau , "d";
Le code:
est censé, je suppose itérer sur ton tableau. Un foreach serait plus efficace et t'épargnerait ce qui me paraît être un bug: la variable $j n'est pas remise à 0, alors que, si j'ai compris ce que tu cherches à faire, elle devrait l'être pour chaque ligne lue dans le fichier.Code:
1
2
3
4 while ($j<= $size){ # ... my ($val1,$val2)=@tabi[$j]; $j++;