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 :

tableau a deux dimensions


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 48
    Points
    48
    Par défaut tableau a deux dimensions
    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

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Utilisez des hash et lisez notre FAQ pour comprendre comment manipuler des tableaux et des hash.

  3. #3
    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
    Pour poursuivre avec la solution de Djibril :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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};
    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

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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++;
    		}
     
    	}
    }
    mais ça marche pas j'ai déja essayé les hash, mais j'ai toujours pas trouvé de solution...

  5. #5
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    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

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    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

  7. #7
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    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.

    Le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($j<= $size){
         # ...
         my ($val1,$val2)=@tabi[$j];
         $j++;
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/03/2006, 17h25
  2. Un string dans un tableau de deux dimensions...
    Par FinalSpirit dans le forum C++
    Réponses: 5
    Dernier message: 15/01/2006, 14h29
  3. [PERL] Trier un tableau a deux dimensions
    Par piregwan dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2005, 22h29
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 16h03

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