Merci !
C'est agreable d avancer a petit pas.
Jules
Mais je continue avec mes questions.
Pourquoi est-ce que je n'arrive pas a rentrer dans la seconde condition (elsif) alors que sur une meme ligne dans la lecture du fichier j ai un
mon fichier
---------------
[groupe] des_tab _et lan_toto
---------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # Vérification et ouverture du fichier base_Lan.txt pour la lecture open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! "); while ($ligne_fichier = <Fichier_lan> ) { if (($ligne_fichier) =~ /\[(\S+)\]\t+\S/ ) # { print "$1 \n"; } elsif ( m/lan/ ) { print ("$1 \n"); } } close Fichier_lan;
Re petite question comment puis je gerer la variable $1 et lui donner un nom ?
Merci
Jule's
"elsif(){}" est un raccourci pour "else { if( ){ } }", donc si tu rentres dans le if, tu ne rentres pas dans le else et donc pas dans le elsif. Si tu veux qu'on puisse rentrer dans les deux pour la même ligne, il faut mettre deux if.Envoyé par calimero642
La variable $1 désigne le contenu capturé par la première paire de parenthèse de la dernière regex. On ne peut pas changer son nom. Mais on peut facilement l'assigner à une variable au nom plus significatif avant d'utiliser cette variable dans la suite du code.Envoyé par calimero642
On peut également assigner directement le contenu capturé dans une regex à une variable :
(attention les parenthèses ont ici leur importance : elle donne le bon contexte à l'expression)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my ($in_sbracket) = ($ligne_fichier =~ /\[(\S+)\]\t+\S/)
--
Jedaï
Merci pour ton aide JEDAI mais pourquoi est ce que $Com_snmp ne m'affiche pas le nom de la communaute snmp serait ce l'exression reguliere qui n est pas correct ?
Sachant que la boucle est verifiee autant de fois que le champ existe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 while ($ligne_fichier = <Fichier_lan> ) { print("\n"); if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # permet de trouver le groupe qui est entre crochets { print "Nom du groupe [$Groupe]\n"; # affiche lme nom du groupe } if (my ($Com_snmp)= (($ligne_fichier) =~/\].*\n/ )) # permet de trouver la communauté snmp du groupe { print ("Nom de la communauté SNMP $Com_snmp"); # } }
Merci Jules
Rectification sur le dernier POST,
La variable $Com_snmp m affiche 1, est ce que cela provient du faite que l'expression reguliere est verifiée ? 1 pour oui et 0 pour non ?
Mais moi ce que je souhaiterai c est recuperer la valeur correspondant a l expression reguliere.
Merci d avance Jules
Tu as oublié les parenthèses capturantes dans la regex...
--
Jedaï
Merci JEDAI je viens enfin de comprendre l'utilisation precedente de $1 ou $2 ou $3 etc. C'est vraiment agreable de pouvoir comprendre jours a pres jours les mysteres du langage PERL.
Merci
Jules
Maintenant je pe donner mon code qui selectionne les element que je voulais. Mais la question qui suit c est comment faire pour creer une base donnees qui va afficher ses information dans une page html, l'interet c est d avoir le fichier ou je cherche mes infos qui sera alimente a la main et qui permettra d obtenir une page web interactive avec les infos.
Mais voici le code pour ceux que ca peut aider::
[code]
#!/usr/bin/perl
# Vérification et ouverture du fichier base_Lan.txt pour la lecture
open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! ");
while ($ligne_fichier = <Fichier_lan> )
{
# print("\n");
if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # expression reguliere qui permet de trouver le groupe qui est entre crochets
{
print "\n Nom du groupe: [$Groupe]"; # affiche lme nom du groupe
}
if (my ($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ )) # expression reguliere qui permet de trouver la communauté snmp du groupe
{
print ("\t Nom de la communauté SNMP: [$Com_snmp] \n"); #
}
if (my ($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/)) # expression reguliere qui permet de trouver le nom du switch
{
print ("\tNom du switch: [$Nom_switch]"); #
}
if (my ($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/)) # expression reguliere qui permet de trouver l'@IP de chaque witch
{
print ("\t\t\t Adresse IP: [$Addr_ip]");
print("\n");
}
}
close Fichier_lan;
[\code]
et voila le fichier
[code]
[Groupe_Test] lanxxx
switch-test 10.45.xx.xx
switch-test1 10.45.xx.xx
[Groupe_Serveurs] lanxxx
switch-test1 10.45.xx.xx
switch-test2 10.45.xx.xx
switch-test3 10.45.xx.xx
switch-test4 10.45.xx.xx
switch-test5 10.45.xx.xx
[\code]
et le resultat est plutot sympa
[code]
Nom du groupe: [Groupe_Test] Nom de la communauté SNMP: [lanxxx]
Nom du switch: [switch-test] Adresse IP: [10.45.11.22]
Nom du switch: [switch-test1] Adresse IP: [10.45.22.33]
Nom du groupe: [Groupe_Serveurs] Nom de la communauté SNMP: [lanxxx]
Nom du switch: [switch-test1] Adresse IP: [10.45.33.44]
Nom du switch: [switch-test2] Adresse IP: [10.45.55.66]
Nom du switch: [switch-test3] Adresse IP: [10.45.66.77]
Nom du switch: [switch-test4] Adresse IP: [10.45.88.99]
Nom du switch: [switch-test5] Adresse IP: [10.45.00.11]
[\code]
Merci tous
Jules
Bonjour à tous, juste pour info il fait super beau en Alsace,
voila j'ai une petite question concernant l'écriture dans un fichier et la portee des variables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 open(Fichier_lan,"< base_Lan_perso") || die ("Vérifiez la présence du fichier base_Lan.txt ou son chemin à la ligne :\n $! "); open(Fichier_resultat,">resultat_info_switch") || die ("Vérifiez la présence du fichier resultat.txt ou son chemin à la ligne :\n $! "); while ($ligne_fichier = <Fichier_lan> ) { if (my ($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # expression reguliere qui permet de trouver le groupe qui est entre crochets { print "\n Nom du groupe: [$Groupe]"; # affiche lme nom du groupe } if (my ($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ )) # expression reguliere qui permet de trouver la communauté snmp du groupe { print ("\t\t\t Nom de la communauté SNMP: [$Com_snmp] \n"); # } if (my ($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/)) # expression reguliere qui permet de trouver le nom du switch { print ("\tNom du switch: [$Nom_switch]"); # } if (my ($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/)) # expression reguliere qui permet de trouver l'@IP de chaque witch { print ("\t\t\t Adresse IP: [$Addr_ip]"); print("\n"); } print Fichier_resultat ( "$Groupe;$Com_snmp;$Nom_switch;$Addr_ip;\n"); } close Fichier_lan; close Fichier_resultat;
Dans le fichier ou je dois ecrire Fichier_resultat il n y a que les points virgules qui s y ecrivent !!!C'est du au variable qui ne valent plus rien en dehors de leur boucle ?
Merci Jules
C'est bon c'était bien du a la protabilite des variables !!!c' était le "my" qui m'empechait de les utiliser !!
Perl >>T es trop fort
Les variables déclaré avec my() sont locales, leur portée est restreinte au bloc où elles sont déclarées. On considère que la condition fait partie du bloc d'une conditionnelle ou d'une boucle. Donc tes variables n'existent pas lors de l'affichage et sont instanciées automatiquement à une valeur 'undef'.
Tu devrais mettre 'use strict;' au début de ton script pour interdire à Perl de déclarer silencieusement des nouvelles variables, cela évite beaucoup d'erreurs. ('strict' est un pragma, c'est à dire qu'il modifie le comportement de perl, l'interpréteur, 'strict' est extrèmement recommandé pour tout le monde).
Pour régler ton problème, il suffit de déclarer les variables préalablement :
La "solution" d'omettre le my() n'est pas bonne car la déclaration implicite n'instancie que des variables globales, et donc pollue l'espace de nom (et la mémoire, Perl a un GC qui supprimera les variables locales quand tu quittes leur portée sans garder de références sur elles). C'est une bonne pratique que d'utiliser my() et strict, tu ne regretteras jamais de l'avoir adopté par la suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 while ($ligne_fichier = <Fichier_lan> ) { my( $Groupe, $Com_snmp, $Nom_switch, $Addr_ip); if (($Groupe)=(($ligne_fichier) =~/\[(\S+)\]\t+\S/ )) # expression reguliere qui permet de trouver le groupe qui est entre crochets { print "\n Nom du groupe: [$Groupe]"; # affiche lme nom du groupe } if (($Com_snmp)= (($ligne_fichier) =~/\]\t+(.*)\n/ )) # expression reguliere qui permet de trouver la communauté snmp du groupe { print ("\t\t\t Nom de la communauté SNMP: [$Com_snmp] \n"); # } if (($Nom_switch)= (($ligne_fichier) =~/(\S+)\t+\d+\.\d+\.\d+\.\d+/)) # expression reguliere qui permet de trouver le nom du switch { print ("\tNom du switch: [$Nom_switch]"); # } if (($Addr_ip)= (($ligne_fichier) =~/\S+\t+(\d+\.\d+\.\d+\.\d+)/)) # expression reguliere qui permet de trouver l'@IP de chaque witch { print ("\t\t\t Adresse IP: [$Addr_ip]"); print("\n"); } print Fichier_resultat "$Groupe;$Com_snmp;$Nom_switch;$Addr_ip;\n"; }
--
Jedaï
Merci c 'est fait dc si j ai bien compris en mettant use strict au debut
et en declarant les variables utilisees avec "my" elles sont innerantes au programmes et c est tout.
Merci
Jules
Bonsoir,
j'ai encore une petite question dans le fichier que je dois scruter il y a des lignes vides et d apres la doc y a moyen de selectionner le fichier et toutes ses lignes quin ne sont pas vides !
Mais je dois avoir une couille car ca me dit merde !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 while ($Ligne_Fichier = <Fichier_Lan> ) { next if (($Ligne_Fichier) =~ /^$/) { if ( ($Groupe)=(($Ligne_Fichier) =~/\[(\S+)\]\t+\S/ )) { print "\n Nom du groupe: [$Groupe]"; } }
Il me dit qu il y a une erreur de syntaxe ? Mais ou ?
Merci d'avance Jules
L'idiome qui permet de sauter les lignes vides est :
(Note bien le ';' à la fin)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 next if $Ligne_Fichier =~ m/^$/;
à placer au début de la boucle.
'if ... ;' est ici un "modificateur d'instruction", c'est à dire qu'il modifie l'instruction qui précède (ici 'next') pour qu'elle ne s'exécute que si la condition est vrai. Mais il y a aussi d'autre modificateur d'instruction comme 'while ... ;' ou 'foreach ...;'.
'next' est une instruction qui permet de sauter directement à l'itération suivante de la boucle dans lequel il se trouve. Je pense que tu comprends maintenant comment cet idiome fonctionne.
On pourrait écrire :
Mais c'est inélégant, on utilise un bloc (donc une portée syntaxique) de plus (et ceci n'est pas gratuit, donc autant éviter).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while( ){ if( not m/^$ ){ # code normal de la boucle } }
On préfère donc le joli petit idiome présenté ci-dessus.
--
Jedaï
Impecable rspect Mr. Jedai,
et je te remercie pour ta pedagogie car c'est vraiment bien explique il est vrai que j'avais essayé sansa le pt virgule et ben ca plantait !!! Donc encore merci.
J espere que je respecte la deontologie du forum en essayant de chercher avant de demander la reponse toute cuite !!!
Jules
Pas de problème. Juste si tu peux mettre ton thread en résolu en cliquant sur le boutonEnvoyé par calimero642
, ce serait super.
@++
GLDavid
Consultez la FAQ Perl ainsi que mes cours de Perl.
N'oubliez pas les balises code :tagcode: ni le tag :resolu:
Je ne répond à aucune question technique par MP.
Partager