Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2763 connectés 

  FORUM HardWare.fr
  Programmation

  [PERL] remplacement de partie dans un tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] remplacement de partie dans un tableau

n°129364
fabriceMer​c
Posté le 22-04-2002 à 16:01:12  profilanswer
 

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
 :hello:

 

[jfdsdjhfuetppo]--Message édité par fabriceMerc le 22-04-2002 à 16:02:23--[/jfdsdjhfuetppo]

mood
Publicité
Posté le 22-04-2002 à 16:01:12  profilanswer
 

n°129367
Tentacle
Posté le 22-04-2002 à 16:06:34  profilanswer
 

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 :
  1. s/^\s*(.*)\s*$/$1/

mets plutôt (.*?) à la place de (.*) pour éviter des effets inattendu comme récupérer plus que prévu dans ces parenthès là.

n°129370
fabriceMer​c
Posté le 22-04-2002 à 16:08:44  profilanswer
 

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]

n°129373
Tentacle
Posté le 22-04-2002 à 16:11:51  profilanswer
 

Donc en gros tu aimerais que

Code :
  1. 0:60:b0:f:6:24

se transforme en

Code :
  1. 00:60:b0:0f:06:24

c'est ça?

n°129375
fabriceMer​c
Posté le 22-04-2002 à 16:13:36  profilanswer
 

tout à fait

n°129398
Tentacle
Posté le 22-04-2002 à 16:40:31  profilanswer
 

Essaie ça :
$ip_mac contient l'adresse IP MAC :)
 

Code :
  1. my @ip_mac = split (/:/, $ip_mac); # je récupère les <> parties
  2. unshift (@ip_mac, split(//, '0'x(6-scalar @ip_mac))); #manière très bourrine de rajouter les parties manquantes... ya sûrement mieux
  3. my $new_ipmac = sprintf("%02s:%02s:%02s:%02s:%02s:%02s", @ip_mac); # et hop :)


 
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"

n°129407
fabriceMer​c
Posté le 22-04-2002 à 16:47:58  profilanswer
 

tout marche PARFAITEMENT alors la merci  :bounce:  
 
mais pk avec la fonction splice cela ne marchait pas ?

n°129424
Tentacle
Posté le 22-04-2002 à 17:04:09  profilanswer
 

fabriceMerc a écrit a écrit :

tout marche PARFAITEMENT alors la merci  :bounce:  
 
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 :
  1. $amacs[$i] = "0" . $amacs[$i];


 
Sinon à part ça, le split s'utilise avec un expression régulière. Dans ton cas

Code :
  1. split (/hardware ethernet/, $_)

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.

n°145376
fabriceMer​c
Posté le 27-05-2002 à 12:36:07  profilanswer
 

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

n°145421
fabriceMer​c
Posté le 27-05-2002 à 13:18:03  profilanswer
 

merde je suis dans le caca si je comprends pa la ligne  :ouch:

mood
Publicité
Posté le 27-05-2002 à 13:18:03  profilanswer
 

n°145621
Tentacle
Posté le 27-05-2002 à 17:33:28  profilanswer
 

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 :D
 
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 :
  1. @ip_mac = ('fe', '00', 'ab')

(à la suite du split).

Code :
  1. scalar @ip_mac

renvoie le nombre d'élément dans @ip_mac. Je veux savoir combien il m'en manque donc je fais

Code :
  1. (6 - scalar @ip_mac)

.
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 :D

n°145906
fabriceMer​c
Posté le 28-05-2002 à 10:09:47  profilanswer
 

si si sa me sert justement !!
 
d'ailleurs je te remercie pour tes explications .
 
 
 :hello:

n°146526
Tentacle
Posté le 28-05-2002 à 21:56:28  profilanswer
 

fabriceMerc a écrit a écrit :

si si sa me sert justement !!
 
d'ailleurs je te remercie pour tes explications .
 
 
 :hello:  




 
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 :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [PERL] remplacement de partie dans un tableau

 

Sujets relatifs
[ Perl ] comment "un-tainter" un array ?[Perl] interpreteur pour win 2k...
[ php ou perl + rezo ] actualiser l'ip d'une machine sous adslMettre une carte graphique sur un image en fond de tableau dans dream?
[PERL] Liste des tables dans Access.... SQL commande ?[PERL] execution de programme externe
[Perl] J'arrive pas a obtenir ce que je veux avec les regexp[PERL] supression des espaces de début et de fin dans une chaine
[C++Builder] Tableau d'images[Perl] comment créer un fichier (text) et y ecrire des chaines de cara
Plus de sujets relatifs à : [PERL] remplacement de partie dans un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR