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 :

Perl et le parcours de tableaux (3D)


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Perl et le parcours de tableaux (3D)
    Bonjour,
    Je programme avec plusieurs langages et récemment j'ai appris le perl. Et j'ai un problème qui est extrêmement étrange... Malgré le fait que j'ai réussi a le fix.
    Ainsi je poste sur ce forum pour essayer d'avoir une explication
    J'initialise un tableau 3D pour stocker des données et je souhaite le parcourir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @tab1 = map [map [map 3, 1..6], 1..3], 1..3; #Oui c'est compliqué des tableaux 3D mais j'en ai besoin...
     
    foreach $id (@tab1) {
    foreach (@$id) {
    print "@$_[0] and $_[0] \n"; #affiche "3 and  3 and  3 and  3 and  3 and  3 and  " en boucle
    }}
    Et la surprise : le bon affichage se fait avec @$_[0] et non $_[0] ... Autrement dit : faut-il mettre un arobase lorsque l'on parcourt un tableaux en Perl pourtant il me semblait que la bonne syntaxe était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab2[3] et non @tab2[3]
    Cordialement.

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 412
    Points : 2 061
    Points
    2 061
    Par défaut
    Bonjour,

    Ben tu as toi-même la solution puisque tu as bien remarqué que
    ramène un sous-tableau, dans la mesure où tu fais après :
    et non
    Il y a un très bon tuto sur developpez
    Le cours de Sylvain Lhullier mérite le détour !

    Perso je ne suis pas un spécialiste, mais voici vite fait quelques manipulations :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    #! /user/bin/perl
    use strict;
    use warnings;
    use utf8;
    use feature qw /say/;
     
    ActiverAccents();
     
    # QUESTION de  http://www.developpez.net/forums/d1469509/autres-langages/perl/langage/perl-parcours-tableaux-3d/ 
    =pod
    my @tab1 = map [map [map 3, 1..6], 1..3], 1..3; #Oui c'est compliqué des tableaux 3D mais j'en ai besoin...
     
    foreach $id (@tab1) {
    	foreach (@$id) {
    		print "@$_[0] and $_[0] \n"; #affiche "3 and  3 and  3 and  3 and  3 and  3 and  " en boucle
    	}
    }
    =cut
     
    my @D1  = ( 1..5 );
    my @D2  = ( 20..26 );
    my @D3  = ( 30..38 );
    my @Tab = ( \@D1, \@D2, \@D3 );
     
    print $#Tab."\n\n";                # Affiche 2 soit le numéro du dernier élément de @Tab. @Tab a donc 3 dimensions 0, 1 et 2
    print $#D1."\n";                   # Affiche 4 soit le numéro du dernier élément de @D1
    print $#D2."\n";                   # Affiche 6 soit le numéro du dernier élément de @D2
    print $#D3."\n\n";                 # Affiche 8 soit le numéro du dernier élément de @D3
     
    print "D1:". $Tab[0][0] ."\n";     # Affiche  1 soit le premier élément de la dimension 1
    print "D2:". $Tab[1][0] ."\n";     # Affiche 20 soit le premier élément de la dimension 2
    print "D3:". $Tab[2][0] ."\n\n";   # Affiche 30 soit le premier élément de la dimension 3
     
    # Print par dimension
    for my $un (0..$#D1) {
    	print "N1=". $Tab[0][$un] ."\n";
    }
    print "\n";
     
    for my $deux (0..$#D2) {
    	print "N2=". $Tab[1][$deux] ."\n";
    }
    print "\n";
     
    for my $trois (0..$#D3) {
    	print "N3=". $Tab[2][$trois] ."\n";
    }
    print "\n";
     
    # Parcours de toutes les dimensions
    foreach my $id (@Tab) {
    	foreach my $un (@D1) {
    		print "$un \n";
    		foreach my $deux (@D2) {
    			print "   $deux \n";
    			foreach my $trois (@D3) {
    				print "      $trois \n";
    			}
    		}
    	}
    }
    print "\n";
     
    # Applatissement de toutes les valeurs contenues dans @Tab
    print "Applatissement de toutes les valeurs contenues dans \@Tab\n";
    foreach my $id (@Tab) {
    	foreach (@$id) {
    		print "$_ ";
    	}
    	print "   ";
    }
    print "\n\n";
     
    # Récupéation d'un sous-tableau
    print "Récupéation d'un sous-tableau 3 fois :\n";
    print "D1=@D1";
    print "\n";
    print "D2=@D2";
    print "\n";
    print "D3=@D3";
    print "\n\n";
     
    # Récupéation d'un sous-tableau say au lieu de print
    print "Récupéation d'un sous-tableau 3 fois say au lieu de print pour D3 :\n";
    print "D1= @D1";
    print "\n";
    print "D2= @D2";
    print "\n";
    print "D3= ". @D3 ."                           Noter la différence avec le suivant, utilité de say !";
    print "\n";
    say "D3= ". "@D3";
    print "\n\n";
     
     
    # Récupération du 1er sous-tableau
    print "Récupération du 1er sous-tableau :\n";
    print @{$Tab[0]};
    print "\n\n";
     
    # Récupération de tous les sous-tableaux
    print "Récupération de tous les sous-tableaux :\n";
    foreach my $ind ( @Tab ) {
    	print @$ind;
    	print "\n";
    }
    print "\n\n";
     
    # Autre Récupération de tous les sous-tableaux
    print "Autre Récupération de tous les sous-tableaux :\n";
    foreach my $ind1 ( @Tab ) {
    	foreach my $ind2 ( @$ind1 ) {
    		print "$ind2\t";
    	}
    	print "\n";
    }
    print "\n\n";
     
    # Autre initialisation :
    print "Autre initialisation :\n\n";
    @D1  = ( 0..5,"Potenkine",7..10 );
    @D2  = ( 0..3,"Potenkine",5..10 );
    @D3  = ( 0..7,"Potenkine",9..10 );
     
    #NB @Tab = TOUJOURS ( \@D1, \@D2, \@D3 );
     
    my $L = 6;
    my $l = 4;
    my $P = 8;
     
    if ( $Tab[0][$L] eq $Tab[1][$l] and
    		 $Tab[0][$L] eq $Tab[2][$P] ) {
    	print "Touché coulé => $Tab[0][$L]";
    }
    print "\n";
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89

  3. #3
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Un tableau de tableaux est en fait un tableau de références à des sous-tableaux.

    Tu récupères donc des références à des sous-tableaux et l'arobase permet de déréférencer ces références (pour les traiter comme des tableaux). L'arobase n'est pas un sigil dans ce cas, mais un opérateur de déréférencement.

    Au lieu de :
    tu aurais aussi pu écrire:
    ce qui indique sans doute plus clairement ce qui se passe.

  4. #4
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Quelques exemples complémentaires sous le debugger Perl:

    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
     
      DB<8> @a = ( [ qw / 1 2 3 /], [qw / 4 5 6/], [qw /7 8 9/]); # tableau de tableaux
     
      DB<9> x \@a; # affiche la structure du tableau de tableaux 
    0  ARRAY(0x600500980)
       0  ARRAY(0x600500950)
          0  1
          1  2
          2  3
       1  ARRAY(0x600500728)
          0  4
          1  5
          2  6
       2  ARRAY(0x6004f9dd8)
          0  7
          1  8
          2  9
      DB<10> print $a[2] ; # imprime la référence au troisième tableau
    ARRAY(0x6004f9dd8)
     
      DB<11> $aref =  $a[2];
     
      DB<12> print $aref
    ARRAY(0x6004f9dd8)
      DB<13> print "@$aref";
    7 8 9
      DB<14> print "@$aref[0]";
    7
      DB<15> print "$aref->[0]";
    7
    Le tableau @a contient trois éléments, des scalaires, 0x600500950, 0x600500728 et 0x6004f9dd8, qui sont des références (en quelque sorte des pointeurs ou adresses mémoire) vers des sous-tableaux.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Merci
    Bonjour,

    Merci pour vos réponses j'ai enfin eu ma réponse(légère redondance, effet de style voulue). Sur ce bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.2] Parcours de tableaux (POST)
    Par LadyArwen dans le forum Langage
    Réponses: 3
    Dernier message: 18/06/2010, 14h58
  2. Parcours de tableaux
    Par developpeur99 dans le forum Langage
    Réponses: 6
    Dernier message: 23/01/2009, 10h33
  3. Parcours de Tableaux à n dimensions
    Par maxperchus dans le forum C#
    Réponses: 3
    Dernier message: 02/05/2008, 16h53
  4. Parcours de tableaux
    Par BATCHOS CON TEQUILA dans le forum C++
    Réponses: 4
    Dernier message: 03/02/2008, 13h08
  5. [Tableaux] Parcours de tableaux
    Par it_bcn dans le forum Langage
    Réponses: 29
    Dernier message: 06/04/2007, 12h09

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