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

  FORUM HardWare.fr
  Programmation
  Perl

  Que pensez vous de mon script perl ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Que pensez vous de mon script perl ??

n°1668711
specimen35
Posté le 10-01-2008 à 10:32:41  profilanswer
 

Bonjour,
bon ce script doit recupérer des données de quotas disque puis les transformer en varible . ensuite une connexion a distance sera etablie avec le module dbd::mysql et une requete d'insertion sera crée pour nourrir la base ; voici mon script :
 
#!/usr/bin/perl -w
use strict;
use DBI;
use CGI;
 
my $cgi = new CGI;
my $recup = ` sed -e '1,/-\+/d;/^$/,$d' repquota -v/chemin`  
my ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2);
 
print "Content-type: text/html\n\n";
 
#Connection à la base de données mysql avec le module dbd::mysql (conncetion à distance)
$dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                      $user, $password, {RaiseError => 1});
 
#Requete sur la base de donnée  
my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
                      $number, $dbh->quote("name" ));
  $dbh->do($query);
 
while ($ligne = $recup){
# récupération des éléments
 ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2) = split /;/,$ligne;
# et on insere dans la base
  $db->do("insert into client values ('$user1','$used1','$soft1','$hard1','$grace1','$used2','$soft2','$hard2','$grace2')"
 
);
          or die "pb de requete : $DBI::errstr";

mood
Publicité
Posté le 10-01-2008 à 10:32:41  profilanswer
 

n°1668769
anapajari
s/travail/glanding on hfr/gs;
Posté le 10-01-2008 à 11:53:08  profilanswer
 

j'aurais utilisé des prepared statement plutot que du do dans tous les sens ( particulièrement dans ta boucle). Et puis beaucoup de variables ne servent pas à grande chose

Code :
  1. ...
  2. my $insertSth = $dbh->prepare("insert into client values(?,?,?,?,?,?,?,?,?,?)" );
  3. while($ligne= $recup){
  4.  $insertSth->execute( split/;/,$ligne) or die "pb de requete : $DBI::errstr";
  5. }
  6. $insertSth->finish();


Ah et je vois pas à quoi te sert CGI.
 
Est-ce ça que tu attendais comme commentaire?

n°1668781
Taz
bisounours-codeur
Posté le 10-01-2008 à 12:04:28  profilanswer
 

Les points positifs:
- utilisation de sed
- injection SQL

n°1668782
specimen35
Posté le 10-01-2008 à 12:04:31  profilanswer
 

Oui merci . oki je vois se que tu veu dire mise a part mes variables :)  
 
Enfaite c'est variables viennent a partir de ce ci :  
 
 

Code :
  1. sed -e '1,/-\+/d;/^$/,$d' rep //rep = fichier
  2. root -- 157696 0 0 12 0 0
  3. uucp -- 40 0 0 76 0 0
  4. fradin -- 2304352 2500000 2550000 12465 50000 55000


 
j'en est besoin pour nourrir ma base de donnée distante .  
 
Ensuite une fois tous les info reuni je ferai du php sur mon serveur distant puis a l'aide de ma tables j' informerai chaque utilisateur sur une   page web . ici Sur leur quota disque  

n°1669405
dreameddea​th
Posté le 11-01-2008 à 01:30:28  profilanswer
 

Il faudrait utiliser les balises "code", ça facilite les choses pour la lecture (numérotation des lignes, ...) .
 
1) il manque un ; à la fin de la ligne 7
2) Utiliser Sed est serte compact, mais je préferre néanmoins "ouvrir" un fichier et faire des greps dessus, je trouve cela plus lisible (d'ailleurs, je n'étant pas sed friendly, je ne suis pas sûr de ce que cela filtre)
3) Pour moi le programme boucle indéfiniement, vu que ni $recup, ni $ligne ne sont modifiés dans la boucle. D'ailleurs, si je comprend bien le code, il serait même plus judicieux de "parser" le résultat du "repquota" dans la boucle.
4) Oui il faut vraiment faire le $dbh->prepare, une habitude à prendre...
 
Cordialement,

n°1669455
specimen35
Posté le 11-01-2008 à 09:19:42  profilanswer
 

que peut tu me proposer en resultat final ( exemple avec mon code )
merci d'avance

n°1669503
specimen35
Posté le 11-01-2008 à 10:16:12  profilanswer
 

je ne sais pas parser je debute , c'est mon premier code perl

n°1670377
dreameddea​th
Posté le 13-01-2008 à 15:28:47  profilanswer
 

Voilà quelques éléments d'aide. Sachant que l'idée générale, c'est :ouvrir, lire ligne par ligne et parser chaque ligne
 
Pour ouvrir, il y a deux suivant ce que l'on veut récupérer :

Code :
  1. #ouverture d'un fichier
  2. open(FIC_HANDLE,"< $filename" ) or die("Cannot open $filename" );
  3. #recupération d'un std out d'une commande (par exemple 'ls -ail')
  4. open(CMD_HANDLE,"$cmd |" ) or die ("Cannot pipeline the command $cmd" );


 
Pour parcourir les lignes il faut utiliser le diamant :

Code :
  1. while ($line = <FIC_HANDLE> ){
  2. }


 
Pour parser, il faut mieux utiliser les expressions régulières et/ou la commande split

Code :
  1. while(...){
  2.     #vire le retour chariot de la fin de ligne
  3.     chomp($line);
  4.     ########
  5.     # Solution split
  6.     ########
  7.     #separe suivant les caractères "espaces" (retour chariot, tabulation,...)
  8.     @res_splitting = split(/\s/,$line);
  9.     ########
  10.     # Solution regexp
  11.     ########
  12.     @res_parsing = ($line =~ m/[expression_reg avec des () pour récupérer des valeurs/);
  13.     next if(scalar(@res_parsing)==0); #passe à la ligne suivante si le tableau est vide (signication que rien n'a matché)
  14.     ###################
  15.     #traitement du resultat à mettre ici (tes "$stmt->execute" )
  16.     #########################
  17. }


 
Cordialement,


Message édité par dreameddeath le 13-01-2008 à 15:43:40
n°1670601
specimen35
Posté le 14-01-2008 à 09:22:07  profilanswer
 

tres bonne explication merci mise a par <FIC_HANDLE> que je ne voit pas qu'es ce que c'est

n°1671210
dreameddea​th
Posté le 14-01-2008 à 23:03:24  profilanswer
 

Cela permet d'obtenir la ligne suivante du fichier ouvert dans le handle FIC_HANDLE (car utilisé dans un contexte scalaire)

Code :
  1. $toto = <>;


permet de lire une ligne de l'entrée standard (stdin)


Message édité par dreameddeath le 14-01-2008 à 23:04:58
mood
Publicité
Posté le 14-01-2008 à 23:03:24  profilanswer
 

n°1671418
matafan
Posté le 15-01-2008 à 12:52:16  profilanswer
 

<> c'est pas tout à fait stdin, c'est l'entrée par défaut. Qui peux être stdin si aucun fichier n'a été spécifié, mais qui est le fichier dont le nom a été passé en argument si un argument a été donné. <> c'est pas la même chose que <STDIN>.


Message édité par matafan le 15-01-2008 à 12:53:12
n°1671449
specimen35
Posté le 15-01-2008 à 13:43:21  profilanswer
 

Bon resultat des course j'ai realisé quelque changement car j'ai vu qu'il y avait un module quota en perl voici le script qui marche je l'espere : je vais faire une maquette cette apre midi  

Code :
  1. #!/usr/bin/perl
  2. use strict;use warnings;
  3. use DBI;
  4. use Quota;
  5. my $base = 'aaa';
  6. my $host = 'localhost';
  7. my $user = 'root';
  8. my $pass = 'aaaaaaaa';
  9. my $mysql_sock = '/var/run/mysqld/mysqld.sock';
  10. #Connection à la base de données
  11. my $db = DBI->connect("DBI:mysql:database=$base;
  12.                        host=$host;
  13.                        mysql_socket=$mysql_sock",
  14.                        $user,
  15.                        $pass,
  16.                        {RaiseError => 1}
  17.                      );
  18. my $dev = Quota::getdev('/'); # à modifier avec ton chemin
  19. while(my ($nom,$uid) = (getpwent())[0,2]){
  20.         my @tmp = Quota::query($dev,$uid);
  21.         if (eval(join '+',@tmp) > 0){
  22.                 my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map {$db->quote($_)} @tmp;
  23.                 my $nom_ = $db->quote($nom);
  24. # insertion dans la base de données
  25. $db->do("INSERT INTO quota
  26.           (utilisateur,u1,s1,h1,g1,u2,s2,h2,g2) VALUES  (
  27.                   $nom_,
  28.                   $u1,
  29.                   $s1,
  30.                   $h1,
  31.                   $g1,
  32.                   $u2,
  33.                   $s2,
  34.                   $h2,
  35.                   $g2)
  36.           " )
  37.         or die "pb de requete : $DBI::errstr";
  38.         }
  39. }
  40. __END__


Message édité par specimen35 le 15-01-2008 à 13:44:51
n°1671746
dreameddea​th
Posté le 15-01-2008 à 19:40:26  profilanswer
 

Tu as encore oublié le prepare/execute
Sinon, le coup du eval(join('+',@tmp)) est pas forcément ultra efficace...
 
j'aurai plutôt vu  
[ccp]
if(scalar(grep{$_!=0}@tmp)>0){
...
}
[/cpp]

n°1671972
specimen35
Posté le 16-01-2008 à 10:38:42  profilanswer
 

avec mon script j'ai une erreur :  
 
 
[root@pc-b27-52 bin]# ./gregpython.pl  
Use of uninitialized value in numeric gt (> ) at ./gregpython.pl line 26.
 

n°1673082
dreameddea​th
Posté le 18-01-2008 à 01:02:55  profilanswer
 

Bah sans le "nouveau" script on peut difficilement aider.
 
Mais je pense que tu as du "undef" dans ton tableau @tmp, ce qui fait que tu as ce message de warning (ce n'est qu'un warning en perl).
 


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

  Que pensez vous de mon script perl ??

 

Sujets relatifs
[rech] Script Webmail multi-emailsProblème sur un script PHP de calendrier
[PERL] Perl et onduleursProbleme de "logique de script"
Script enlever espaces d'un nom de fichieraide creation script batch rennomage de fichiers
Crrer un script pour sortir les image de document wordscript php: probleme de recupération de données
script PHP / service WindowsPeut on mettre des commandes linux dans un script en python
Plus de sujets relatifs à : Que pensez vous de mon script perl ??


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