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

Langage Perl Discussion :

Question sur une variable d'un script


Sujet :

Langage Perl

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut Question sur une variable d'un script
    Bonjour,

    J'aurais voulu savoir à quoi correspondais le $1 dans ce script (il permet de savoir si le fichier à plus de un jour, et il permet également de savoir si il n'y a pas de fichiers copiés) J'ai l'impression que cette variable est magique et sa m'énerve vraiment de pas comprendre comment elle peux arriver à tout faire. Je vous laisse juger par vous même :



    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
    #
    #						0 : OK
    #						1 : WARNING
    #						2 : CRITICAL
    #
    #     
    #
    # ====================================================================================
    #
    # PARAMETRES D'APPEL : rien
    #
    # ====================================================================================
     
    use strict;
     
    my $FicLog = "";
     
    my $Infile = 'C:\applinat\Nagios\plugins\local\am_check_pabxcav.ini';
    open IN, "< $Infile" or die "Can't open $Infile : $!";
    ($FicLog) = <IN>;
    chomp($FicLog);
     
    # Date et Heure du Jour
    my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday) = localtime();
    $mon++;
    $year += 1900;
    my $Date_W=sprintf("%02d/%02d/%04d",$day,$mon,$year);
     
    if (!open(LOG, $FicLog)) {
    	print "ERREUR !!! IMPOSSIBLE D'OUVRIR LE FICHIER: $FicLog";
    	exit 2;
    }
     
    while (<LOG>) {
      chomp;
      if (/ERREUR/) {
        print "$_";
        exit 2;
      } elsif (/DEBUT DE LA COPIE DES SAUVEGARDES DU PABX CAV.*(..\/..\/....)/) {
        # Control de la date
        if ($1 ne $Date_W) {
          print "LE FICHIER LOG A PLUS D'UN JOUR - VERIFIER LA TACHE PLANIFIE SUR LE SERVEUR";
          exit 2
        }
      } elsif (/([0-9]+) fichier/) {
      	if ($1 eq "0") {
      		print "AUCUN FICHIER N'A ETE COPIE";
      		exit 1;
      	}
      } elsif (/FIN DE LA COPIE DES SAUVEGARDES DU PABX DU CAV/) {
      	print "$_";
      	exit 0;
      }
    }
    close (LOG);
    print "PROBLEME SUR LA RECUPERATION DES SAUVEGARDES PABX DU CAV SUR LE W11130113BCKCAV";
    exit 2;

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    La variable $1 est effectivement magique (à effet de bord devrait-on dire). Elle résulte de l'évaluation d'une expression régulière contenant des parenthèses capturantes. La variable $1 contient la première valeur capturée, $2, la deuxième, etc...

    Il existe un moyen d'éviter l'emploi de ces variables "automatique" et "à effet de bord" (c'est à dire qui sont modifiées par des instructions autres que l'affectation explicite), car il suffit d'enchainer deux évaluation d'expressions régulières pour perdre les valeurs $1, $2, de la première après la seconde. Au lieu d'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      } elsif (/DEBUT DE LA COPIE DES SAUVEGARDES DU PABX CAV.*(..\/..\/....)/) {
        # Control de la date
        if ($1 ne $Date_W) {
          print "LE FICHIER LOG A PLUS D'UN JOUR - VERIFIER LA TACHE PLANIFIE SUR LE SERVEUR";
          exit 2
        }
      } elsif (/([0-9]+) fichier/) {
          if ($1 eq "0") {
              print "AUCUN FICHIER N'A ETE COPIE";
              exit 1;
          }
    écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      } elsif (my ($date) = /DEBUT DE LA COPIE DES SAUVEGARDES DU PABX CAV.*(..\/..\/....)/) {
        # Control de la date
        if ($date ne $Date_W) {
          print "LE FICHIER LOG A PLUS D'UN JOUR - VERIFIER LA TACHE PLANIFIE SUR LE SERVEUR";
          exit 2
        }
      } elsif (my ($fichier) = /([0-9]+) fichier/) {
          if ($fichier eq "0") {
              print "AUCUN FICHIER N'A ETE COPIE";
              exit 1;
          }

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    et je ne dois pas déclarer les variables date et fichier ? Ce langage est vraiment bizarre il devine ce qu'on veux faire sans rien lui dire c'est un peu bizarre là. La le script détecte que le fichier à plus d'un jour et renvoi à une erreur de type 2, moi je voudrais que cela sois deux jours mais étant donné que je n'assimile pas que faudrait t-il faire pour qu'il détecte que le fichier a plus de deux jour ? Je pense que je comprendrais mieux après ça. (il faut que je garde ces variable à effet de bord par contre sa m'est imposé c'est pour sa que j'aimerais les comprendre)

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Comme tout langage, il ne fait que ce qu'on lui dit
    En l'occurence que lui dis-tu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Date et Heure du Jour
    my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday) = localtime();
    $mon++;
    $year += 1900;
    my $Date_W=sprintf("%02d/%02d/%04d",$day,$mon,$year);
    Tu récupères la date actuelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      } elsif (/DEBUT DE LA COPIE DES SAUVEGARDES DU PABX CAV.*(..\/..\/....)/) {
    Pendant la lecture de ton fichier de log tu captures des infos de date (enfin on espère, ca pourrait être le nom d'un serveur Domino aussi, mais c'est un autre débat...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($1 ne $Date_W) {
          print "LE FICHIER LOG A PLUS D'UN JOUR - VERIFIER LA TACHE PLANIFIE SUR LE SERVEUR";
          exit 2
    Tu compares la(les) date capturée à la date courant pour déterminer si tu es bien sur le bon jour.

    Si tu veux passer à 2 jours de rétention, quelle variable vas-tu modifier ? Celle que tu captures ou celle qui est fixe ?
    Que devient ton test de date ? Est-il toujours bon en l'état ? Doit-il être adapté ?

    @+
    Mr6

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par aurelien13008 Voir le message
    et je ne dois pas déclarer les variables date et fichier ?
    En perl, la déclaration n'est pas obligatoire (sauf à utiliser le module strict, ce qui est fortement recommandé). Cela dit, je l'ai bien déclaré, directement dans le if. En perl, comme d'ailleurs dans d'autres langages, il est possible de déclarer une variable à peut près n'importe où dans le code, et pas uniquement en début de bloc comme dans le C K&R.
    Ce langage est vraiment bizarre il devine ce qu'on veux faire sans rien lui dire c'est un peu bizarre là.
    C'est aussi là tout son charme

    Pour le reste, Mr6 t'a fait une très bonne explication de texte.

  6. #6
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Je vois ce que tu veux dire Mr6, mais le soucis et c'est là que sa se complique c'est que je n'ai pas le fichier de log qui servait à l'utilisation de ce script, mais je dois l'adapter pour un nouveau fichier de log qui comporte des similitude, mais la date de la sauvegarde qui doit être comparé à la date local se trouve dans ce fichier de log sous la forme : SAUVEGARDE LE 7/10/2010 A 10:37
    Et je n'ai pas l'impression que ce script capture la date de la sauvegarde dans le fichier log, en fait je ne vois pas à quel moment il capture la date du fichier log : je vois très bien qu'il capture la date de l'ordinateur donc la date local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Date et Heure du Jour
    my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday) = localtime();
    $mon++;
    $year += 1900;
    my $Date_W=sprintf("%02d/%02d/%04d",$day,$mon,$year);
    Mais la date du fichier log est juste représenté par un $1, $1 ne représente pas la date de la création du fichier log. Pour résumer, ou dans ce script la date de la création du fichier log est capturé, elle est comparé a la date local certe, mais ou est elle capturé ? Là est ma question.

  7. #7
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Allons allons, un petit effort !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Infile = 'C:\applinat\Nagios\plugins\local\am_check_pabxcav.ini';
    Tu lis ta conf Nagios
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ($FicLog) = <IN>;
    ...
    if (!open(LOG, $FicLog)) {
        print "ERREUR !!! IMPOSSIBLE D'OUVRIR LE FICHIER: $FicLog";
    Puis tu lis le contenu du fichier de log qui est déclaré dans ta conf.
    Tu parcours ton fichier de log ligne par ligne à la recherche entre autres de l'info suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    } elsif (/DEBUT DE LA COPIE DES SAUVEGARDES DU PABX CAV.*(..\/..\/....)/) {
    et lorsque tu la trouves tu captures dans $1 et tu compares avec la date du jour.

    C'est plus clair dit comme ca ?

    @+
    Mr6

  8. #8
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Effectivement c'est bien plus clair comme ça, j'avais compris a peu près le parcours ligne par ligne, mais je ne voyais pas ou il l'enregistré dans $1 enfin je ne le vois toujours pas mais c'est bien plus clair effectivement, par contre c'est vrais que pour deux jours au lieu d'un je ne trouve pas, la il compare la date du fichier log à la date local si elle n'est pas égale il renvoi que le fichier de log est vieux de plus d'un jour, en fait c'est un minimum et moi je voudrais que sa parte de deux jours, et sa je ne sais pas comment faire mais j'ai des idées, je pensé par exemple à capturé la date local et lui enlevé un jour. Confirme moi si c'est possible merci

    Voila mon fichier log qui comporte des erreurs mais qui ne colle pas avec le script étant donné qu'il faut que je l'adapte.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ==== DEBUT DE FICHIER ==== le :05/10/2010 à 05:14:36
     
    XCOPY FICHIERS XML OK 
    ATTENTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! A vérifier: Xcopy a copié 0 fichiers
     
     ====> 0 FICHIERS XML COPIES ET 0 FICHIER IMAGES COPIES
     
    ==== FIN DE FICHIER ==== le :05/10/2010 à 05:21:10

  9. #9
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    ce sont les parenthèses dans le match qui permettent la capture.

    cf ma 1ère réponse sur le sujet Si tu te contentes de calculer le jour précédent, tu risques fort de ne pas conserver ceux du jour. Perso je convertirais la date que tu captures en timestamp, afin de la comparer plus facilement avec la date à ne pas dépasser (donc $Date_W n'a plus besoin d'être formaté, juste calculé à la date souhaitée).
    Je te laisse gratter encore un peu

    @+
    Mr6

  10. #10
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Tient voila mon fichier log (j'avais édité mon message plus haut)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ==== DEBUT DE FICHIER ==== le :05/10/2010 à 05:14:36
     
    XCOPY FICHIERS XML OK 
    ATTENTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! A vérifier: Xcopy a copié 0 fichiers
     
     ====> 0 FICHIERS XML COPIES ET 0 FICHIER IMAGES COPIES
     
    ==== FIN DE FICHIER ==== le :05/10/2010 à 05:21:10
    En regardant de plus près je vois que la capture pour la date ne sera pas la même, confirme tu ?

  11. #11
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Et encore une petite chose, je ne trouve rien concernant la conversion de localtime en timestamp

  12. #12
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Citation Envoyé par aurelien13008 Voir le message
    En regardant de plus près je vois que la capture pour la date ne sera pas la même, confirme tu ?
    Prends un peu plus de temps pour lire ton code, le comprendre et relis ce qui a déjà été dit. Ton fichier de log est ce qu'il est, et pour le moment tu ne comprends pas encore ton code en l'état, donc tu ne peux pas comprendre comment le modifier.
    N'hésite pas à utiliser google pour chercher la doc, en l'occurence si tu tapes perl timestamp tu trouveras des explications, voir un coup de pouce. Idem pour le fonctionnement du match et de ses variables spéciales.

    @+
    Mr6

  13. #13
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    J'ai déjà vu le premier site, mais il ne transforme pas un localtime en timestamp il transforme une date précise en timestamp, il faudrait que je fasse un print du localtime pour après pour voir le convertir en timestamp je trouve ça assez compliqué quand même, curieux qu'il n'existe pas d'autre méthode. Pour ce qui est de mon code je l'ai lu et relu je commence à peine à le comprendre tu a raison mais bon ça commence.

    (je suis stagiaire dans une grande entreprise et on me donne ce genre de travail sur perl à effectué mais étant donné que je n'ai que très rarement fais du perl je suis vraiment largués c'est pour ça que je te demande de l'aide ^^)

  14. #14
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Regarde la fonction time
    pour obtenir le timestamp courant (et donc pour le recalculer selon tes besoin). L'autre site te permettra de convertir la date précise contenue dans ton fichier de log pour etre en timestamp également.
    Aider oui, faire à ta place non (c'est pour ca que je ne te donne pas de code pour le moment ). Ca n'a aucun intérêt si à la fin de la foire tu n'as pas compris ce que tu as écrit


    @+
    Mr6

  15. #15
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Non non la réponse je ne la veux pas c'est sur, mais j'apprécie vraiment ton aide, je t'explique pourquoi je me lance dans des choses compliqué alors que je n'y comprend rien mais c'est pas pour justifier le fait que tu me donne des réponses "gratuitement", pour ce qui est de ce site je ne vois pas ou il transforme le localtime en timestamp je doit surement être aveugle

  16. #16
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print (mktime(10,45,11,31,4,107));
    sachant que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
    Ca te rappelle pas le découpage de localtime ? Si tu découpes la date capturée dans ton fichier de log tu peux la passer dans mktime pour obtenir le timestamp.

    Maintenant si tu as lu la fonction time, tu sais qu'elle te retourne le timestamp actuel, auquel tu as juste à soustraire le nombre de secondes nécessaire pour remonter au timestamp de la date que tu veux comme référence. Une comparaison entre les 2 éléments et c'est gagné.

    @+
    Mr6

  17. #17
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Ok pour le timestamp de la date capturé du fichier log, sa c'est bon j'ai compris

    Maintenant pour le timestamp du localtime, j'ai bien lu la fonction time, il suffirait que je la mette dans mon script pour quelle m'affiche le timestamp du localtime ?

  18. #18
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Oublies localtime time est suffisant.

  19. #19
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 65
    Par défaut
    Ok donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday) = time
    Non je ne pense pas que ce sois ça tout de même ?!

  20. #20
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Ah non, pour écrire cela, il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday) = localtime(time);
    Voir
    perldoc -f localtime

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. question simple sur une variable date
    Par xavier_dcf dans le forum Débuter
    Réponses: 2
    Dernier message: 14/02/2013, 15h53
  2. [MySQL] Question sur les Variables dans une requête php-Mysql
    Par rvtoulon dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/02/2012, 12h06
  3. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  4. Envoi d'une variable en shell script sur php
    Par Ponchi dans le forum Langage
    Réponses: 3
    Dernier message: 07/02/2006, 13h54
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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