IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

illegall division by zero non justifié"?"


Sujet :

SGBD Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut illegall division by zero non justifié"?"
    Bonjour je suis nouveau sur le forum , et en perl.
    J'ai pour mission de remetttre en fonctionnement un script qui recupere dans un fichier des donées pour les injecter en base mysql, et apparement, en ressortir egalement des fichiers ordonnés. Lorsque je le lance, il me sort cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Illegal division by zero at ./script.pl line 69, <FDESC> line 5245
    or les champs censés etre divisés dans cette ligne ne correspondent pas a zero, voici la ligne
    1214829884 STEP 0 r58841 3457 6666 6583 wrigleyref

    Je vous joins le script
    Help

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use POSIX;
    use Date::Parse;
    use File::Copy ;
     
    # To connect mysql thru network
    use Net::MySQL;
    my $mysql = Net::MySQL->new(
          hostname => 'io', 
          database => 'stats_test',
          user     => 'bidule',
          password => 'machin',
     
    my $stat_dir = '/adm/pcs_admin/stat' ;
    copy("$stat_dir/test_stats","$stat_dir/last_run_stats") or die "file copy error : $!" ;
    my $stat_source = "$stat_dir/last_run_stats";
     
     if ( -z $stat_source ) {
     print " file empty, exiting..." ;
     exit 0;
     } 
    open( FDESC , "< $stat_source" ) or die "Can't open $orca_stat_source : $!";
     
    foreach my $line ( readline(*FDESC) ) {
    	my ( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time,$Prod )  ;
    	my @Liste = split ( /\s+/ , $line ) ;
    	my $Nb_el = $#Liste + 1 ;
    	if ( $Nb_el == 7 ) {
    	( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time ) = @Liste ;
    	} else {
    	( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time, $Prod ) = @Liste ;
    	}
    	my $avrg_test_time =  $Test_duration/$Nb_test ;
    	if ( $Nb_test==0 ) {
    	$Test_duration = 0 ;
    	}
    	my %now_date = getHDate( $timestamp );
     
    	my $Date = sprintf ( "%4d-%02d-%02d" , $now_date{year} ,  $now_date{month} , $now_date{day}) ;
    	if ( $Nb_el == 7 ) { 
    	$mysql->query(qq{
          	INSERT INTO stats ( Timestamp, Date, Type, Purify, User, Nb_test, Test_duration, Average_test_time, Total_exec_time  ) 
    	  VALUES ( '$timestamp','$Date', '$Type', '$Purify', '$User', '$Nb_test', '$Test_duration', '$avrg_test_time', '$Total_exec_time' ) 
      	});
    	} else {
    		$mysql->query(qq{
          	INSERT INTO stats ( Timestamp, Date, Type, Purify, User, Nb_test, Test_duration, Average_test_time, Total_exec_time, Product  ) 
    	  VALUES ( '$timestamp','$Date', '$Type', '$Purify', '$User', '$Nb_test', '$Test_duration', '$avrg_test_time', '$Total_exec_time', '$Prod') 
     
      	});
    	}
     
    }
    Jai rajouté les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $Nb_test==0 ) {
    $Test_duration = 0 ;
    }
    au cas ou, mais elles n'y étaient pas et l'erreur est la meme.

    L'accés a la base est bien réalisé, et quelque entrées sont insérées, jusqu'a ce que le script s'arrete sur l'erreur citée.
    Voici le bout de script qui devrait créer les fichiers.

    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
    35
    if ($mysql->get_affected_rows_length == 0 ) {
      printf "The SQL query failed %s \n";$mysql->get_error_message;
      }
    close (FDESC) ;
    #close (FILE) ;
    # close de DB connexion
    $mysql->close;
     
    sub getHDate {
            my %Date = ();
            my ($sec,$min,$hour,$mday,$mon,$year) = gmtime($_[0]);
            $year += 1900;
            $mon += 1;
     
            $Date{second}   = $sec;
            $Date{minute}   = $min;
            $Date{hour}     = $hour;
            $Date{day}      = $mday;
            $Date{month}    = $mon;
            $Date{year}     = $year;
     
            $Date{smonth}   = "Jan" if $mon == 1;
            $Date{smonth}   = "Feb" if $mon == 2;
            $Date{smonth}   = "Mar" if $mon == 3;
            $Date{smonth}   = "Apr" if $mon == 4;
            $Date{smonth}   = "May" if $mon == 5;
            $Date{smonth}   = "Jun" if $mon == 6;
            $Date{smonth}   = "Jul" if $mon == 7;
            $Date{smonth}   = "Aug" if $mon == 8;
            $Date{smonth}   = "Sep" if $mon == 9;
            $Date{smonth}   = "Oct" if $mon == 10;
            $Date{smonth}   = "Nov" if $mon == 11;
            $Date{smonth}   = "Dec" if $mon == 12;
            return %Date;
    }
    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu devrais utiliser les balises codes afin de rendre ton script lisible.
    Quand tu postes trop rapidement un message et que tu veux le corriger, tu peux utiliser la case "éditer".


    Afin d'éviter une erreur, tu devrais inverser ces 2 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $avrg_test_time = $Test_duration/$Nb_test ;
    if ( $Nb_test==0 ) {
    $Test_duration = 0 ;
    }

    Est-ce la ligne 69 du script?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $avrg_test_time = $Test_duration/$Nb_test;
    -- Jasmine --

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci Jasmine, en effet c'est beaucoup plus clair.
    Il s'agit bien de la ligne 69. Pardon j'ai omis de le preciser.

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    or les champs censés etre divisés dans cette ligne ne correspondent pas a zero, voici la ligne
    1214829884 STEP 0 r58841 3457 6666 6583 wrigleyref
    Cette ligne ne provoque pas de division par zéro
    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
     
    my $line = '1214829884 STEP 0 r58841 3457 6666 6583 wrigleyref';
    my @Liste = split ( /\s+/ , $line ) ;
    my $Nb_el = @Liste;
    my ( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time, $Prod );
    if ( $Nb_el == 7 ) {
        ( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time ) = @Liste ;
    }
    else {
        ( $timestamp, $Type, $Purify, $User, $Nb_test, $Test_duration, $Total_exec_time, $Prod ) = @Liste ;
    }
     
     
     
    if ( $Nb_test == 0 ) {
       $Test_duration = 0 ;
       print "erreur pour la ligne $line";
    }
     
    my $avrg_test_time =  $Test_duration/$Nb_test ;
     
    print "$avrg_test_time\n";
    Réponse
    $avrg_test_time = 1.92826149840903
    Es-tu certain que ce soit la ligne dont tu parles qui pose problème?
    Que renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( $Nb_test == 0 ) {
       $Test_duration = 0 ;
       print "erreur pour la ligne $line";
    }

    Autre remarque, au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Nb_el = $#Liste + 1 ;
    Fais plutôt
    -- Jasmine --

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci Jasmine

    J'obtiens toujours la meme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Illegal division by zero at ./monitor_test_campaing.pl line 68, <FDESC> line 5245
    pour la meme ligne qui correspond à l'opération:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $avrg_test_time =  $Test_duration/$Nb_test ;
    rien de plus.

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    As-tu bien ajouter my $avrg_test_time après la vérification de la valeur de $nb_test? Normalement le programme devrait t'écrire la ligne posant problème avant de s'arrêter. Peut-être dois-tu rajouter $| = 1; au début du script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( $Nb_test == 0 ) {
       $Test_duration = 0 ;
       print "erreur pour la ligne $line";
    }
     
    my $avrg_test_time =  $Test_duration/$Nb_test ;
    -- Jasmine --

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    En effet, J'avais mis le print après la division. rectifié.
    J'obiens bien la ligne qui poste probleme et il ne s'agit pas de la ligne que l'erreur précédente me donnait, qui était la derniere ligne.
    Et il y a bien un zero ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1205227814 STEP 0 r58841 0 952 135 umts_r26331
    Comment faire donc pour que cette erreur ne se produise pas?

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Que veux-tu faire de cette ligne? L'ignorer? Tu peux utiliser la fonction next.
    -- Jasmine --

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour Jasmine

    Oui, je compte l'ignorer. Les ligne où ce paramètre est à 0 sont rares, et fausseraient les stats.
    Je vais regarder la fonction next d'un peu plus près.
    Merci à toi . Si tu n'étais pas si loin je te pairais un café.

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tant mieux si cela fonctionne et dommage que je sois si loin ... j'adore le café c'est une de mes drogues avec le chocolat miam miam.

    next est très simple à utiliser;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use strict;
     
    my @num = (0, 1, 2, 3, 4, 5, 6, 7, 8);
     
    foreach my $num (@num){
     
        if($num < 3){
            next;
        }
     
        print $num."\n";
     
    }
    affichera
    3
    4
    5
    6
    7
    8
    N'hésite pas si tu as d'autres questions.
    -- Jasmine --

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si tu souhaites tout simplement éviter qu'une division par zéro ne pose problème, tu peux mettre le calcul dans un eval.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # make divide-by-zero nonfatal
        eval { $answer = $a / $b; }; warn $@ if $@;
    Mais bon, pourquoi ne pas juste vérifier que ta valeur est à zéro et si c'est le cas, tu ne fais pas de calcul ou bien, tu fais un warning ou autre

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par djibril Voir le message
    Si tu souhaites tout simplement éviter qu'une division par zéro ne pose problème, tu peux mettre le calcul dans un eval.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # make divide-by-zero nonfatal
        eval { $answer = $a / $b; }; warn $@ if $@;
    Mais bon, pourquoi ne pas juste vérifier que ta valeur est à zéro et si c'est le cas, tu ne fais pas de calcul ou bien, tu fais un warning ou autre
    oui, c'est ce que je proposais de faire avec le next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( $Nb_test == 0 ) {
             next;
    }
    my $avrg_test_time = $Test_duration/$Nb_test;
    -- Jasmine --

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci Jasmine
    You are THE best
    Fan de chocolat, ça m'aurait étonné en Belgique. Je fais un stock chaque fois que j'y vais. J'ai de la famille en Picardie.
    Encore Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/09/2006, 16h39
  2. Réponses: 3
    Dernier message: 20/09/2006, 13h20
  3. [Math][Info]division par zéro
    Par niko8181 dans le forum Général Java
    Réponses: 9
    Dernier message: 23/05/2005, 09h58
  4. Réponses: 3
    Dernier message: 16/09/2004, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo