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

Programmation et administration système Perl Discussion :

Perl (CGI) : Warnings incompréhensibles!


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Points : 130
    Points
    130
    Par défaut Perl (CGI) : Warnings incompréhensibles!
    Bonjour les puristes,

    J'ai deux soucis qui me semblent un peu illogiques :

    1)
    Quelqu'un pour me dire s'il vous plaît pourquoi ce code :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    use  CGI;
    use strict;
    use Switch;
    use warnings;
    use Text::CSV;
     
    my $system_report ="/path_to_report/system_report.csv";
    my %state = (0 => ["CHECK_OK", "#008000"],
                 1 => ["CHECK_WARNING", "#FFA500"],
                 2 => ["CHECK_CRITICAL", "#FF0000"],
                 3 => ["CHECK_UNKNOWN", "#FFA07A"]);
    my $csv_source = Text::CSV->new ({
    binary => 1,
    auto_diag => 1,
    sep_char => ';'
    });
    open(my $fh, '<:encoding(utf8)', $system_report) or die "Could not open '$system_report' $!\n";
    #$csv_source->getline($fh);
    $csv_source->column_names ($csv_source->getline($fh));
    my $query = CGI->new;
    print $query->header(-type => 'text/html');
    print $query->start_html(-title=>'Systems Check Report',
                             -author=>'toto',
                             -base=>'true',
                             -target=>'_blank',
                             -meta=>{'keywords'=>'pharaoh secret mummy',
                                     'copyright'=>'copyright 1996 King Tut'},
                             -style=>{'src'=>'/styles/system_report.css'},
                             -BGCOLOR=>'blue');
     
    print $query->br(), $query->br(), $query->hr(), $query->h3({-align => 'center'}, 'Systems Check Report'); $query->hr();
    print $query->start_table({-class => "gridtable", -align => "center"},
                        $query->Tr($query->th(['System Name', 'IP Address', 'Category', 'Environment', 'Location', 'Description', 'List Of Services', 'Service Status', 'Service Information'])));
    while (my $fields = $csv_source->getline_hr( $fh ))
    {
            #if ($fields->{"Service Status"} eq $state{0}[0])
            #print '$fields->{"Service Status"}', "\n";
            #my $status = $fields->{"Service Status"};
            if ($fields->{'Service Status'} eq $state{0}[0])
            {
                    print $query->Tr($query->td([$fields->{"System Name"},
                                     $fields->{"IP Address"},
                                     $fields->{"Category"},
                                     $fields->{"Environment"},
                                     $fields->{"Location"},
                                     $fields->{"Description"},
                                     $fields->{"List Of Services"},
                                     ({-bgcolor => $state{0}[1]}, $fields->{"Service Status"}),
                                     $fields->{"Service Information"}]));
            }
            if ($fields->{'Service Status'} eq $state{1}[0])
            {
                    print $query->Tr($query->td([$fields->{"System Name"},
                                     $fields->{"IP Address"},
                                     $fields->{"Category"},
                                     $fields->{"Environment"},
                                     $fields->{"Location"},
                                     $fields->{"Description"},
                                     $fields->{"List Of Services"},
                                     ({-bgcolor => $state{1}[1]}, $fields->{"Service Status"}),
                                     $fields->{"Service Information"}]));
            }
            if ($fields->{'Service Status'} eq $state{2}[0])
            {
                    print $query->Tr($query->td([$fields->{"System Name"},
                                     $fields->{"IP Address"},
                                     $fields->{"Category"},
                                     $fields->{"Environment"},
                                     $fields->{"Location"},
                                     $fields->{"Description"},
                                     $fields->{"List Of Services"},
                                     ({-bgcolor => $state{2}[1]}, $fields->{"Service Status"}),
                                     $fields->{"Service Information"}]));
            }
            if ($fields->{'Service Status'} eq $state{3}[0])
            {
                    print $query->Tr($query->td([$fields->{"System Name"},
                                     $fields->{"IP Address"},
                                     $fields->{"Category"},
                                     $fields->{"Environment"},
                                     $fields->{"Location"},
                                     $fields->{"Description"},
                                     $fields->{"List Of Services"},
                                     ({-bgcolor => $state{3}[1]}, $fields->{"Service Status"}),
                                     $fields->{"Service Information"}]));
            }
    }
    print $query->end_table();
    print $query->end_html();
    close $fh;
    me génère cette erreur (un warning en fait) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in string eq at ./system_report.cgi line........, <$fh> line .....
    à chaque tour de boucle, si j'utilise les warnigs?

    Je sais que votre réponse sera de me demander de tester si la variable est définie. Et oui elle n'est pas undef c'est justement ce qui me sidère, et je n'ai cette erreur que dans le if et les autres lignes j'ai commentées. L'utilisation de la même variable dans la suite du code ne me génère pas d'erreur.
    Le test avec print affiche bien la valeur et signale ensuite la même erreur pour la fonction print. Et cette erreur est signalé uniquement pour cette variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fields->{"Service Status"
    dans le statement.

    Voici les colonnes et un extrait de mon fichier csv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System Name;IP Address;Category;Environment;Location;Description;List Of Services;Service Status;Service Information
    SERVER01;4.2.2.2;FTP Server;Linux;Wesr Coast;FTP West Coast Server;connectity;OK;Host is alive
    Il est différent bien plus important que ça en contenu, mais vous avez là un copier/coller de mes noms colonnes.

    2) Dans la même foulée comme vous pouvez le voir dans mon code, je veux afficher des couleurs en fonction d'une certaine valeur, et donc j'ai affecté une valeur au paramètre -bgcolor de la balise td, mais le code html généré ne contient pas cet attribut. Ce n'est pas une erreur cette fois, mais ça ne marche simplement pas, et je n'ai pas trouver de doc de Perl CGI me permettant de faire ce que je veux faire.

    Partie du code concernée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            if ($fields->{'Service Status'} eq $state{0}[0])
            {
                    print $query->Tr($query->td([$fields->{"System Name"},
                                     $fields->{"IP Address"},
                                     $fields->{"Category"},
                                     $fields->{"Environment"},
                                     $fields->{"Location"},
                                     $fields->{"Description"},
                                     $fields->{"List Of Services"},
                                     ({-bgcolor => $state{0}[1]}, $fields->{"Service Status"}),
                                     $fields->{"Service Information"}]));
            }
    Pouvez-vous tester de votre côte avec et sans le
    s'il vous plaît? Et voir aussi pourquoi mon script ne génère pas le bon code html pour l'attribut de couleur dans ma balise td ici ?

    Merci à vous.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Sur la première question.

    Si cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($fields->{"Service Status"} eq $state{0}[0])
    génère le warning que tu cites, alors soit $fields->{"Service Status"} n'est pas défini, soit $state{0}[0] n'est pas défini (soit les deux). Si tu es sûr que la première est définie, alors l'erreur poste sur le seconde. Est-ce bien un hash de tableaux?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print '$fields->{"Service Status"}', "\n";
    Cette impression ne sert à rien parce que les apostrophes ne permettent pas l'interpolation des variables.

    La seconde question, je passe.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    J'ai regardé à nouveau, la variable %state semble bien initialisée pour ce que tu compares. Mais en consultant le message d'erreur, il semblerait qu'il n'ait pas lieu dans ton programme, mais dans le module que tu appelles. Autrement dit, il semble que tu ne donnes pas les bons paramètres à ton module. Mais là, ne connaissant pas le module, je ne peux pas trop t'aider.

    Donne quand même le warning en entier, plutôt que des "...", ça peut aider.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Points : 130
    Points
    130
    Par défaut
    print '$fields->{"Service Status"}', "\n";

    Cette impression ne sert à rien parce que les apostrophes ne permettent pas l'interpolation des variables.
    Non en fait j'ai copié la mauvaise version du print car je faisais des tests dans tous les sens. La vraie syntaxe est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$fields->{"Service Status"}", "\n";
    Et oui le problème se pose uniquement sur $fields->{"Service Status"}. J'ai tout tester avec les deux.

    Et si tu testes de ton côté (Le code marche, faut juste tester), tu verras que dans les lignes suivantes l'utilisation de la même variable ne pose aucun souci au compilateur.

    Tu demandes si qu'est-ce qui est un hash de tableaux? est un hash de tableaux, et est un hash.

    Tu as testé? Tu y vois quelque chose?

    Merci.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    En fait Lolo, la ligne d'erreur en question est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in string eq at ./system_report.cgi line 54, <$fh> line 65
    J'ai mis les ..... à la place des numéros de ligne parce qu'il y en avait plusieurs, mais en fait c'était celle-là.

    Par ailleurs j'ai résolu le souci. En fait j'ai régénéré le fichier avec de nouvelles valeurs et le champs "Service Status". J'ai juste modifié le code qui génère le csv pour une autre raison, et comme par hasard je n'ai plus le warning.

    Donc je pense qu'à un moment il devrait y avoir une entrée du hash à undef ou un truc du genre que le compilo n'aimait pas, mais je ne sais pas dire exactement.

    Mon deuxième souci demeure, et j'ai vraiment envie de rester dans l'utilisation de Perl::CGI. Pour l'instant j'ai fait dans l'urgence un cgi en shell qui m'affiche ce que je veux, mais j'essaye démystifier le problème en perl.

    Si vous avez une idée, je vous en remercie d'avance.

    Cordialement.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    J'ai pu reproduire l'erreur.

    Et je confirme qu'elle venais de mon fichier csv généré.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/06/2007, 15h27
  2. Réponses: 1
    Dernier message: 22/09/2005, 20h39
  3. [perl/CGI] Ecrire du HTML dans un script perl
    Par LE NEINDRE dans le forum Web
    Réponses: 3
    Dernier message: 02/08/2005, 14h50
  4. [Perl/CGI] application de CSS
    Par slaborde dans le forum Web
    Réponses: 4
    Dernier message: 02/08/2005, 14h45
  5. Réponses: 5
    Dernier message: 19/07/2004, 17h27

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