[Perl - Débutant]Probleme de comparaison de 2 chaines

Probleme de comparaison de 2 chaines [Perl - Débutant] - Perl - Programmation

Marsh Posté le 09-05-2007 à 23:08:27    

bonjour,
débutant en perl depuis tres peu de temps, j'essaye de mettre en place un script permettant de récupérer mon adresse publique, et de la comparer à celle d'un fichier de configuration (vsftp).
 
Voici mon code :  
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. ################################
  5. ##### IP PUBLIQUE ACTUELLE #####
  6. ################################
  7. use LWP::Simple;
  8. my $page=get("http://192.168.1.1" );
  9. if ($page=~m/(\d+\.\d+\.\d+\.\d+)/)
  10. {
  11.         print "IP publique actuelle : $1\n";
  12. }
  13. my $ip=$1;
  14. ##################################
  15. ##### IP PUBLIQUE DU FICHIER #####
  16. ##################################
  17. my $ligne;
  18. my $nom_fichier="/etc/test.conf";
  19. $ligne = `grep -i "pasv_address" $nom_fichier`;
  20. my $file_ip;
  21. my $longueur_ip = length($ligne);
  22. $file_ip=substr($ligne,13,$longueur_ip-1);
  23. print "IP vsftpdae actuelle : $file_ip";
  24. ################################
  25. ##### COMPARAISON DES DEUX #####
  26. ################################
  27. my $res_cmp="égales";
  28. if (($file_ip ne $ip)==1)
  29. {
  30.         $res_cmp="différents";
  31. }
  32. print "Résultat : $res_cmp\n";


 
Le probleme viens lors de la comparaison, qui ne s'effectue pas correctement (toujours valeur a 0). Je suppose que c'est dû au type de "$1" (ip publique que je recupère).
Avez vous une idée ???
 
Merci
Ced

Reply

Marsh Posté le 09-05-2007 à 23:08:27   

Reply

Marsh Posté le 10-05-2007 à 00:46:58    

obn à chaud comme ca, et sans le résultat à l'écran c'est un peu dur à débugguer

 

mais qques conseils pratiques pour perl :
1) évite les commandes systèmes sauf si tu ne peux pas le faire en perl
pour ta lecture de fichier, il est généralement conseillé d'ouvrir un file descriptor et de le stocker dans une liste, ce qui te facilitera les manipulations après coup

Code :
  1. open FILE, "/etc/test.conf";
  2. @lines = <FILE>;
  3. close FILE;
  4. @ip_match = grep /pasv_address/, @lines;


avec ce bout de code, tu auras les lignes contenant "pasv_address" dans un tableau, tu pourrais également pousser plus loin le vice en ne prenant pas en compte les lignes commentées, et autre exceptions qui pourraient t'arriver

 

2) utilises des regex plutôt que des substr, ca rendra ton truc plus souple, parce que là je sais pas trop ce que tu as récupéré ; un exemple con :

Code :
  1. #pasv_address                          192.168.1.1


sera récupérée par ta commande système grep, alors que c'est une ligne commentée
De plus, ton substring ne marchera pas à cause du # et des nombreux espaces entre le paramètre et sa valeur

 


sinon pour ton problème, tu utilises le bon opérateur ("ne" ) même si la condition est redondante => voici 3 lignes équivalentes :

Code :
  1. if (($file_ip ne $ip)==1) { ... }
  2. if ($file_ip ne $ip) { ... }
  3. unless ($file_ip eq $ip) { ... }


perso je préfère la dernière ligne, mais bon chacun ses goûts et sa manière de travailler

 

donc ton problème est peut-être dans les chaînes mêmes, peut-être as-tu un caractère pourri qui se balade (retour chariot, espace, ...)
essayes de débugguer, soit en faisant des affichage écrans plus visibles comme par exemple :

Code :
  1. print "xxxxx".$file_ip."xxxxx"

et là tu verras totu de suite si t'as un truc pourri qui se balade soit en utilisant le débuggeur perl (perl -d script.pl)

 

mais bon à priori ca a l'air bon, mais mon cerveau n'est pas un interpréteur perl avec je peux pas aller plus loin


Message édité par couak le 10-05-2007 à 00:47:43
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed