Que pensez vous de mon script perl ??

Que pensez vous de mon script perl ?? - Perl - Programmation

Marsh Posté le 10-01-2008 à 10:32:41    

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";

Reply

Marsh Posté le 10-01-2008 à 10:32:41   

Reply

Marsh Posté le 10-01-2008 à 11:53:08    

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?

Reply

Marsh Posté le 10-01-2008 à 12:04:28    

Les points positifs:
- utilisation de sed
- injection SQL

Reply

Marsh Posté le 10-01-2008 à 12:04:31    

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  

Reply

Marsh Posté le 11-01-2008 à 01:30:28    

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,

Reply

Marsh Posté le 11-01-2008 à 09:19:42    

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

Reply

Marsh Posté le 11-01-2008 à 10:16:12    

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

Reply

Marsh Posté le 13-01-2008 à 15:28:47    

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
Reply

Marsh Posté le 14-01-2008 à 09:22:07    

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

Reply

Marsh Posté le 14-01-2008 à 23:03:24    

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
Reply

Marsh Posté le 14-01-2008 à 23:03:24   

Reply

Marsh Posté le 15-01-2008 à 12:52:16    

<> 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
Reply

Marsh Posté le 15-01-2008 à 13:43:21    

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
Reply

Marsh Posté le 15-01-2008 à 19:40:26    

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]

Reply

Marsh Posté le 16-01-2008 à 10:38:42    

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.
 

Reply

Marsh Posté le 18-01-2008 à 01:02:55    

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).
 

Reply

Sujets relatifs:

Leave a Replay

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