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]