remplacement de partie dans un tableau [PERL] - Programmation
Marsh Posté le 22-04-2002 à 16:06:34
tu pourrais donner un exemple de chaîne en entrée, et n'oublie pas de désactiver les smileys à ce moment-là ;p 
 
Déjà un conseil, dans ton expression régulière 
| Code : 
 | 
mets plutôt (.*?) à la place de (.*) pour éviter des effets inattendu comme récupérer plus que prévu dans ces parenthès là.
Marsh Posté le 22-04-2002 à 16:08:44
en entrée dans un fichier: ( avec les deux formes d'adresses MAC) 
 
host bacteril0003 { 
 	hardware ethernet	00:60:b0:bf:6a:d1; 
 	ddns-hostname  "bacteril0003"; 
 	fixed-address  10.10.5.229; 
 } 
 host bacteril0004 { 
 	hardware ethernet	0:60:b0:f:6:24; 
 	ddns-hostname  "bacteril0004"; 
 	fixed-address  10.10.5.230; 
 } 
 
 
et en sortie je voudrais  
0060b0bf6ad1 
0060b00f0624 
[jfdsdjhfuetppo]--Message édité par fabriceMerc le 22-04-2002 à 16:10:48--[/jfdsdjhfuetppo]
Marsh Posté le 22-04-2002 à 16:11:51
Donc en gros tu aimerais que
| Code : 
 | 
se transforme en
| Code : 
 | 
c'est ça?
Marsh Posté le 22-04-2002 à 16:40:31
Essaie ça : 
$ip_mac contient l'adresse IP MAC :) 
 
| Code : 
 | 
 
 
Voilà, j'ai testé quand même pour être sûr que ça marche :D 
 
donc "af:b:30" donne "00:00:00:af:0b:30" 
Marsh Posté le 22-04-2002 à 16:47:58
tout marche PARFAITEMENT alors la merci   
  
 
mais pk avec la fonction splice cela ne marchait pas ? 
Marsh Posté le 22-04-2002 à 17:04:09
| fabriceMerc a écrit a écrit  : tout marche PARFAITEMENT alors la merci   mais pk avec la fonction splice cela ne marchait pas ? | 
 
 
En fait déjà je ne vois pas pourquoi tu utilises splice là, tu pourras tout simplement faire : 
| Code : 
 | 
 
 
Sinon à part ça, le split s'utilise avec un expression régulière. Dans ton cas 
| Code : 
 | 
 marchera mieux. 
Mais pour éviter les split en masse, je te conseille plutôt ceci : 
my ($hard) = $_ =~ /hardware ethernet\s*([0-9a-f:]*)/; 
et ensuite il te fallait continuer au niveau de @amacs = split ... 
Ensuite ça devrait marcher (essaie la fonction foreach au lieu de for pour un tableau, c'est plus pratique parfois) à part que tu ne rajoutes pas des parties de l'IP si il en manque. 
Marsh Posté le 27-05-2002 à 12:36:07
heum sa fait longtemps mais j'aimerais qu'on m'explique mieux la ligne  
 
unshift (@ip_mac, split(//, '0'x(6-scalar @ip_mac)))  
 
car je ne comprend pas du tout ! 
 
 
merci 
Marsh Posté le 27-05-2002 à 17:33:28
| fabriceMerc a écrit a écrit  : heum sa fait longtemps mais j'aimerais qu'on m'explique mieux la ligne unshift (@ip_mac, split(//, '0'x(6-scalar @ip_mac))) car je ne comprend pas du tout ! merci | 
 
Disons déjà que c'est très très bourrin (j'en suis pas fier  
 
 
cette ligne permet de compléter les adresses non complète  (hum)  
En gros si tu as une adresse fe:00:ab bah ca sort 00:00:00:fe:00:ab .  
J'ai eu l'impression que tu en avais besoin ...  
 
Donc si tu n'en as pas besoin, tu peux enlever cette ligne. 
 
Je vais tout de même expliquer par un exemple : 
tu as le tableau 
| Code : 
 | 
 (à la suite du split). 
| Code : 
 | 
renvoie le nombre d'élément dans @ip_mac. Je veux savoir combien il m'en manque donc je fais
| Code : 
 | 
. 
Ensuite je crée une chaîne contenant autant de 0 que le résultat de l'opération précédente, pour cela on utilise x qui copie un caractère autant de fois que le nombre spécifié après. 
ensuite je split tout ça pour avoir un tableau de 3 éléments (exemple) avec des 0 dedans. 
Le unshift sert ensuite à ajouter ce tableau au début du tableau @ip_mac. 
 
Voilà c'est bourrin et ça te sert peut-être à rien  
 
Marsh Posté le 28-05-2002 à 10:09:47
si si sa me sert justement !! 
 
d'ailleurs je te remercie pour tes explications . 
 
 
  
 
Marsh Posté le 28-05-2002 à 21:56:28
| fabriceMerc a écrit a écrit  : si si sa me sert justement !! d'ailleurs je te remercie pour tes explications .   | 
 
 
T'as compris alors ? t'as de la chance, j'ai failli ne plus m'y retrouver quand j'ai vu le truc bourrin que j'avais sorti  
 
Marsh Posté le 22-04-2002 à 16:01:12
en fait voila j'ai des adresses MAC de 2 formes différentes
 
 
00:00:11:22:ff:22 et 1:f:f5:dd:c ( on a tous vu la différence j'espère :-)
bon en fait ce que je voudrais faire c'est convertir toutes celles qui ont la deuxieme forme en la première ( c'est ok ?)
je pose la partie du code qui correspond :
( parce que la je suis newbie en perl, et je comprends pas pourquoi sa marche pas)
#puis la hardware ethernet
my ($t, $hard) = split("hardware ethernet",$_);
if($hard){
($mac,$t) = split(";",$hard);
#bon sa commence la !!!
$mac =~ s/^\s*(.*)\s*$/$1/;
@amacs = split(":",$mac);
for ($i = 0;$i <=$#amacs;$i++)
{
$a = length $amacs[$i];
if ($a == 1) {
splice (@amacs,$i,1,"0$amacs[$i]" ); #c'est cette fonction que je dois pas comprendre
}
}
$mac =~ s/://g; #je supprime tous les :
}
Merci les gars
[jfdsdjhfuetppo]--Message édité par fabriceMerc le 22-04-2002 à 16:02:23--[/jfdsdjhfuetppo]