[PERL] Probleme de splice avec un tableau a 2 dimensions

Probleme de splice avec un tableau a 2 dimensions [PERL] - Perl - Programmation

Marsh Posté le 02-12-2010 à 13:57:54    

Bonjour, j'ai un soucis avec une insertion de ligne dans un tableau a 2 dimension.
 
Je m'explique, jutilise ce code pour faire mon insertion (qui est en faite une duplication de la ligne dans le tableau)
 

Code :
  1. my $replacement = $tab_temp[$nb_ligne];
  2. $nb_ligne++;
  3. splice @tab_temp,$nb_ligne, 0, $replacement;


 
le soucis arrive quand je souhaite faire une modification sur une des lignes 2 lignes précédentes, la modification est répercuté sur les deux lignes en meme temps...
 
Je pense qu'il y a un soucis avec l'adressage lors de la définition de la variable $replacement mais je ne voie pas comment procéder autrement.
 
 
je ne sais pas si je suis bien clair   :heink:  
 
En vous remerciant d'avance


Message édité par dreamkiller le 02-12-2010 à 14:35:29
Reply

Marsh Posté le 02-12-2010 à 13:57:54   

Reply

Marsh Posté le 02-12-2010 à 14:26:06    

Le soucis viens clairement de la ligne  

Code :
  1. my $replacement = $tab_temp[$nb_ligne];


 
la variable $replacement contient a chaque fois un truc comme ca:
ARRAY(0x40087cf8)
 
Elle devrait avoir une liste de valeur a la place

Reply

Marsh Posté le 02-12-2010 à 19:01:41    

Si on pouvait voir le reste du code: définitions de @tab_temp, $nb_ligne, contenu de $tab_temp, on pourrait avoir une idée de la cause du pb.
A priori, si je pige bien, les éléments de @tab_temp sont des arrays? auquel cas, une réponse comme ARRAY(0x40087cf8) est tout à fait normale, $replacement étant défini comme un scalaire.
A+,


Message édité par gilou le 03-12-2010 à 03:36:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-12-2010 à 10:38:31    

Salut merci pour ton aide.
 
Je pense que le code est loin d'etre propre (mes cours de dev sont loin...)
 
 

Code :
  1. sub creloctac (){
  2. my $add_line=0;
  3. my $nb_ligne=0;
  4. my @tab_temp;
  5. $tab_temp[0]=$tab_valeur[0];              ###entete
  6. for (my $j=1;$j<=$tab_index_ligne;$j++)
  7. {
  8.  my $tache_creloctac=$tab_valeur[$j][2];
  9.  $nb_ligne++;
  10.  $tab_temp[$nb_ligne]=$tab_valeur[$j];
  11.  my $deuxieme_passage=0;
  12.  open(my $handle_list_tache_creloctac,  "<", $list_tache)  or die "Can't open $list_tache: $!"; #####Ouverture du fichier TACHES en mode lecture
  13.  while (<$handle_list_tache_creloctac> ) ####Parcourt du fichier en mode ligne a ligne
  14.  {
  15.   $add_line=0;
  16.   my $ligne=$_;
  17.   if ($ligne=~ /CRELOCTAC,/)   ####Si la ligne commence par CRELOCTAC, alors
  18.   {
  19.    if ($ligne=~/TACHE=$tache_creloctac,/) ###Si la ligne contient TACHE=matache, alors
  20.    {
  21.     if ($ligne=~ /LOC=(\w+),/)
  22.     {
  23.      $loc=$1;
  24.      $add_line=1;
  25.     }
  26.     if ($ligne=~ /DEFACT=(\w+),/) #### Si la ligne contient DEFACT=N, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  27.     {
  28.      $defact=$1;
  29.      $add_line=1;
  30.     }
  31.     if ($ligne=~ /CONDACT=(\w+),/) #### Si la ligne contient CONDACT=macond, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  32.     {
  33.      $condact=$1;
  34.      $add_line=1;
  35.     }
  36.     if ($ligne=~ /DEFPRO=(\w+),/) #### Si la ligne contient DEFPRO=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  37.     {
  38.      $defpro=$1;
  39.      $add_line=1;
  40.     }
  41.     if ($ligne=~ /,DEFEXT=(\w+|\*?),/) #### Si la ligne contient DEFEXT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  42.     {
  43.      $defext=$1;
  44.      $add_line=1;
  45.     }
  46.     if ($ligne=~ /DEFSNB=(\w+),/) #### Si la ligne contient DEFSNB=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  47.     {
  48.      $defsnb=$1;
  49.      $add_line=1;
  50.     }
  51.     if ($ligne=~ /DEFSWT=(\w+),/) #### Si la ligne contient DEFSWT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  52.     {
  53.      $defswt=$1;
  54.      $add_line=1;
  55.     }
  56.     if ($ligne=~ /DEFLBL=(\w+),/) #### Si la ligne contient DEFLBL=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  57.     {
  58.      $deflbl=$1;
  59.      $add_line=1;
  60.     }
  61.     if ($ligne=~ /DEFCYC=(\w+),/) #### Si la ligne contient DEFCYC=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  62.     {
  63.      $defcyc=$1;
  64.      $add_line=1;
  65.     }
  66.     if ($ligne=~ /DEFCPT=(\w+),/) #### Si la ligne contient DEFCPT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  67.     {
  68.      $defcpt=$1;
  69.      $add_line=1;
  70.     }
  71.     if ($add_line != 0)
  72.     {
  73.      if ($deuxieme_passage==0)
  74.      {
  75.       $tab_temp[$nb_ligne][12]=$loc;
  76.       $tab_temp[$nb_ligne][13]=$defpla;
  77.       $tab_temp[$nb_ligne][14]=$defact;
  78.       $tab_temp[$nb_ligne][15]=$condact;
  79.       $tab_temp[$nb_ligne][16]=$defpro;
  80.       $tab_temp[$nb_ligne][17]=$defext;
  81.       $tab_temp[$nb_ligne][18]=$defsnb;
  82.       $tab_temp[$nb_ligne][19]=$defswt;
  83.       $tab_temp[$nb_ligne][20]=$deflbl;
  84.       $tab_temp[$nb_ligne][21]=$defcyc;
  85.       $tab_temp[$nb_ligne][22]=$defcpt;
  86.       &ecriture_fichier($loc,$defpla,$defact,$condact,$defpro,$defext,$defsnb,$defswt,$deflbl,$defcyc,$defcpt,"\n" );
  87.       $deuxieme_passage=1;
  88.      }
  89.      else
  90.      {
  91.       my @replacement;
  92.       for(my $k=0;$k<$tab_index_champs;$k++)
  93.       {
  94.        push (@replacement,$tab_temp[$nb_ligne][$k]);
  95.       }
  96.       #print "@replacement\n";
  97.       $nb_ligne++;
  98.       splice @tab_temp,$nb_ligne, 0, @replacement;
  99.       # $tab_temp[$nb_ligne][12]=$loc;
  100.       # $tab_temp[$nb_ligne][13]=$defpla;
  101.       # $tab_temp[$nb_ligne][14]=$defact;
  102.       # $tab_temp[$nb_ligne][15]=$condact;
  103.       # $tab_temp[$nb_ligne][16]=$defpro;
  104.       # $tab_temp[$nb_ligne][17]=$defext;
  105.       # $tab_temp[$nb_ligne][18]=$defsnb;
  106.       # $tab_temp[$nb_ligne][19]=$defswt;
  107.       # $tab_temp[$nb_ligne][20]=$deflbl;
  108.       # $tab_temp[$nb_ligne][21]=$defcyc;
  109.       # $tab_temp[$nb_ligne][22]=$defcpt;
  110.      }
  111.     }
  112.    }
  113.   }
  114.  }
  115.  close $handle_list_tache_creloctac or die "Can't close $list_tache: $!";  ### Fermeture du fichier TACHE2
  116. }


 
 
Le code que j'ai donné au depart a quelque peu changé du coup maintenant j'ai une erreur d'un autre type
 

Code :
  1. Can't use string ("V2_XCH_CHJ_1_JOURNALIER" ) as an ARRAY ref while "strict refs" in use at ./concatenation_extraction_vega3.pl line 243.


 
Pour le contenu de tab_val et tab_temp se sont des tableaux de tableaux donc oui j'ai compris que ARRAY 0x ..... c'etait normal.

Reply

Marsh Posté le 03-12-2010 à 12:07:18    

je pense avoir solutionné le probleme  
 
splice (@tab_temp,$nb_ligne, 0, \@replacement);
 
un tableau a 2 dimensions, c'est un tableau de pointeur donc il faut lui passé une adresse de tableau et non des valeurs.
 
Reste a confirmer que tout fonctionne correctement

Reply

Marsh Posté le 03-12-2010 à 14:37:24    

Citation :

un tableau a 2 dimensions, c'est un tableau de pointeur donc il faut lui passé une adresse de tableau et non des valeurs.

Perl 5 n'a pas de telle structure de données.
Il ne connait que les tableaux simples, dont les éléments sont des scalaires.
Si ces scalaires sont les adresses d'autres tableaux, on peut simuler la notion de tableau à 2 dimensions, mais cela n'a rien d'un type de données intrinsèque à Perl.
En perl 6, la notion de tableau multi dimensionnel a été ajoutée, et bien plus: http://perlcabal.org/syn/S09.html .
A+,


Message édité par gilou le 03-12-2010 à 14:41:53

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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