Pb perl - Perl - Programmation
Marsh Posté le 28-04-2004 à 12:59:58
super titre
je comprens pas quand tu lis une ligne tu récupères l'adresse MAC et le port direct ..
Marsh Posté le 28-04-2004 à 13:08:01
une bonne regex, tu récuperes tout dans un tableau, tu tries après...
Marsh Posté le 28-04-2004 à 13:49:35
Le truc c que je lis chaque ligne du fichier.
Une fois la ligne ds une variable je regarde le nom du switch puis le port. Si cela correspond j'incrémente un compteur.
Je repete cette opération pour toutes les ligne du fichier et pour tous ports de tous les switchs.
Pour etre plus explicite je vous donne un bout de code que j'execute
open(ECRIRE,"$chemin_rapport_ecriture/machines_par_port_de_switch" );
$machine_total_reseau=0; #permet de connaitre le nombre total de machine sur le réseau
foreach $switch (@switches_trouve)
{
printf ECRIRE ("Switch $switch\n" );
for ($j=1 ; $j<51 ; $j++)
{
printf ECRIRE ("$j " );
}
printf ECRIRE (" Total " );
printf ECRIRE (" \n" );
$Nb_machines=0; #permet de connaitre le nombre de machines par switch
$i=1;
for($i=1 ; $i<51 ; $i++) #pour chaque port
{
$Nb_machine=0;
open(LIRE,"$chemin_rapport_lecture/rapport_tous_Switchs.txt" );
while(<LIRE> )
{
@mots=split(";",$_);
if ($mots[1] eq " Switch: $switch " && $mots[3] eq " Port: $i " )
{
$Nb_machine++;
}
}
close LIRE;
printf ECRIRE ("$Nb_machine " );
$Nb_machines = $Nb_machines + $Nb_machine;
}
printf ECRIRE (" $Nb_machines " );
printf ECRIRE (" \n\n" );
$machine_total_reseau = $machine_total_reseau + $Nb_machines;
}
printf ECRIRE ("Le nombre de machines sur le réseau est de $machine_total_reseau" );
close ECRIRE;
voila
Marsh Posté le 28-04-2004 à 14:28:37
sa varie suivant les switch qui peuvent etre connecté au réseaux. actuellement j'en ai 1000 (4switch) mais il plus tard il y aura encore 5 switch de plus.
Marsh Posté le 28-04-2004 à 14:36:47
Si je comprend bien, tu as une ligne sous cette forme :
Code :
|
Et tu veux récupérer "switch-V1-1" et "48" ?
A tester :
Code :
|
Je précise tout de suite : ma RegExp est à affiner !
Dans %liste, chaque switch est une clé, laquelle est un hash de hash qui contient une clé "SWITCH" qui compte le nombre de fois où une ligne a été topée concernant le-dit switch, et d'autres clés "PORTn°" où n° est le n° du port trouvé (les clés comptent le nbre de fois que le port en question est rattaché au switch).
Je m'explique pas super bien mais pour faire un peu plus clair :
Code :
|
Désolé si je ne suis pas assez clair
Marsh Posté le 28-04-2004 à 14:47:18
essaye un truc comme ça:
Code :
|
[edit] grillé de 11 minutes je trouve ça bogosse, en meme temps ma fenetre était passée en arriere plan
alors par rapport à la solution de aricoh avec la mienne tu as une hash avec le nombre de lignes trouvées pour chaque triplet switch|mac|port
[/edit]
Marsh Posté le 28-04-2004 à 14:53:01
Pouurais -tu m'expliquer cette ligne stp:
if (/.+Switch: (.+) +; +Vlan.+Port: (\d+).+/);
Que vien faire le Vlan ici que signifie ces + ce .+/ et ce /. ?
Mer'ci beaucoup
Marsh Posté le 28-04-2004 à 14:59:49
loothoof a écrit : Pouurais -tu m'expliquer cette ligne stp: |
Ceci est une expression régulière.
Pour résumer rapidos : ".+" signifie "tout caractère autre que \n, au moins 1 fois"
Exemple : " +" signifie "1 ou plusieurs espaces"
Ce que j'ai indiqué entre parenthèses, c'est ce que mon expression régulière doit mémoriser et retourner dans $1 et $2 qui sont des variables dédiées aux expressions régulières ($1, $2, $3 et toutes celles dont tu as besoin en fait).
Marsh Posté le 28-04-2004 à 15:01:51
oups pardon, pour "\d+", ça signifie "1 ou plusieurs nombres"
Marsh Posté le 28-04-2004 à 15:04:18
Excuse moi anapajari mais peut tu me commenter ton programme stp car je ne comprend pas grand chose.
Putain plus je découvre le perl et plus je me dit qu'il y en a a découvrir.
Marsh Posté le 28-04-2004 à 15:10:19
pour les expression reguliere tappe ca dans un shell:
"perdoc perlre"
Marsh Posté le 28-04-2004 à 15:12:06
Je reprend mon bout de code pour en faire un truc + simple (à toi de voir)
Code :
|
Voilà. A moins que tu aies besoin de conserver chaque ligne du fichier intacte en mémoire pour un autre traitement, sinon je supprime tous les espaces de la ligne.
Marsh Posté le 28-04-2004 à 16:48:13
qd j'utilise une variable du type hachage voila l'erreur:
Can't use subscript on private hash at Recup_Nb_machines_par_port.pl line 40, near "$1}"
(Did you mean $ or @ instead of %?)
qui connait?
Marsh Posté le 28-04-2004 à 17:13:03
ça te dit pas de montrer ton code ... au moins la ligne 40 ...
Marsh Posté le 29-04-2004 à 10:03:26
Voici mon code
#!/bin/perl
use Tk;
require "mesure_parc.pl";
require "mesure.pl";
require "chemins.pl";
# Recuperation du nombre de machines par port de switch
#-------------------------------------------------------
sub Recup_Nb_machines_par_port
{
# récupération des switchs présent sur le réseaux
system("ypcat hosts | grep switch > liste_switch.txt" );
open (SNMP, "<liste_switch.txt" ) || die "Impossible d'ouvrir liste_switch.txt";
while (<SNMP> )
{
# permet de ne recuperer que les noms des switch
@champ=split(/fr/,$_);
@champ2=split(/ /,$champ[1]);
@champ3=split(/\t/,$champ2[1]);
@champ4=split(/\n/,$champ3[0]);
push(@switches_trouve,$champ4[0]);
}
close SNMP;
system("rm liste_switch.txt" );
open(LIRE,"$chemin_rapport_lecture/rapport_tous_Switchs.txt" );
use strict;
while(<LIRE> )
{
if (/.+Switch: (.+) +; +Port: (\d+).+/)
{
%liste{$1}[$2]++; #ligne ou se trouve le pb
}
else
{
print "ligne $. non topée\n";
}
}
printf %liste;
}
Le pb se trouve a la ligne 36
et voici l'erreur:
Marsh Posté le 29-04-2004 à 10:06:15
Global symbol "%liste" requires explicit package name at Recup_Nb_machines_par_port.pl line 36.
Can't use subscript on hash deref at Recup_Nb_machines_par_port.pl line 36, near "$1}"
(Did you mean $ or @ instead of %?)
Si je rajoute use strict alors j'ai un pb pour toute les variables du type scalaire($)
qui peut m'éclaircir l'esprit?
merci.
Marsh Posté le 29-04-2004 à 10:13:08
les balises cpp c'est bien!!!!
ensuite
Code :
|
Tu vois la différence?
par ailleurs toute cette partie ne sert plus à rien:
Code :
|
tu peux l'enlever.
enfin tu as modifié la regex et c'est n'imp:
Code :
|
edit: et pour le use strict, il va falloir apprendre à déclarer tes variables.
Marsh Posté le 29-04-2004 à 12:09:18
Merci les gars sa marche a présent. il me reste plus qu'a exposer mes données pour que ce soit plus convivial
merci bcp
Marsh Posté le 29-04-2004 à 14:20:18
Une dernière chose, remplace :
Code :
|
par
Code :
|
Eh oui, la commande rm a sa copine en Perl qui fait aussi la même chose, c'est la fonction unlink
Marsh Posté le 28-04-2004 à 12:23:11
Bonjour a tous
je suis en stage et je doit créer un logiciel en perl.
Donc je me suis mis au perl.
Et j'ai un petit pb.
En effet je doit extraire des donné d'un fichier mais voila il faut que je parcours le fichier bcp de fois.
je m'explique:
voici un bout du fichier a parcourir:
---------------------------------------------------------------------------------------
| voici les mesures pour le switch switch-V1-1 |
---------------------------------------------------------------------------------------
Adresse Mac: 000xxxxxxxxx ; Switch: switch-V1-1 ; Vlan: 1 ; Port: 48 ; Description: lien giga<=> switch-C-1
Adresse Mac: 000xxxxxxxxx ; Switch: switch-V1-1 ; Vlan: 1 ; Port: 48 ; Description: lien giga<=> switch-C-1
Adresse Mac: 000xxxxxxxxx ; Switch: switch-V1-1 ; Vlan: 1 ; Port: 48 ; Description: lien giga<=> switch-C-1
C un fichier qui regroupe par switch toutes les @mac et leur port de tous le parc informatique.~700 machines
moi il faut que fasse un petit prog qui compte le nombre de machine derriere chaque port de chaque switch.
Pour ce faire je creé deux boucle une pour les switch et l'autre pour les ports mais avec cette technique le tps est bcp trop long.
Quelqu'un aurai une idée?
merci