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 :

Fonction et variable global


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut Fonction et variable global
    Bonjour,

    J'optimise mon script de sauvegarde et j'implémente de nouvelles actions. Du coup je rencontre de nouveaux problèmes

    J'ai lu qu'une variable déclarée dans le corps du script était globale. Les exemples le montrent, une variable déclarée avant la fonction peut être utilisé dans cette fonction. (arrêté moi si je me trompe )

    Ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub Archive_Tar {
    	my $tar = `tar -cf $path_backup\/$archive_name *`;
    	if ($? != 0) {
    		print (BACKUP_LOG "\t[Erreur] Création de l'archive TAR impossible : $!\n");
    	}
    }
    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $path_http = "/home/$domaine/http";
    if (-r $path_http){
    	my $archive_name = "backup.fichiers.".TimeBackup("date_backup").".tar";
    	&Archive_Tar();
    }
    Mon problème, c'est ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Global symbol "$path_backup" requires explicit package name
    Global symbol "$archive_name" requires explicit package name
    Pour informations, mes pragma sont strict, warnings, bytes.
    Merci d'avance aux personnes qui pourront m'éclairer ^^

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Peux-tu montrer tout ton code ?

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Le voilà
    Les précédentes versions n'incluaient pas de fonctions ni le multi domaine.

    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
    #!/usr/bin/perl
    use strict;     # vérifie que toutes les variables sont bien déclarées avec my
    use warnings;   # demande l'affichage des warnings (erreurs)
    use bytes;
    #
    # Domaines à sauvegarder + nom de la base
    #
    my %domaine = (
    	domaine1 => 'base_1', 
    	domaine2 => 'base_2', 
    	domaine3=> 'base_3'
    );
    #
    ###### Début du script #####
    #
    foreach my $domaine (key (%domaine)) {
            my $path_backup = "/home/$domaine/backup";
    	if (-w $path_backup) {
    		chdir($path_backup);
    		#
    		# Sauvegarde des fichiers
    		#
    		my $path_http = "/home/$domaine/http";
    		if (-r $path_http){
    			chdir($path_http);
    			#
    			my $archive_name = "backup.fichiers.".TimeBackup("date_backup").".tar";
    			&Archive_Tar();
    			#
    			chdir($path_backup);
    		}
    		else {
    			print ("[erreur] Le répertoire $path_http ne peut pas être lu.\n");
    		}
    	}
    	else {
    		die;
    	}
    };
    #
    ###### Fin du script #####
    #
    #
    #Définition des fonctions
    #
    sub TimeBackup{
    my @Ljour = qw(dimanche lundi mardi mercredi jeudi vendredi samedi);
    my @Lmois = qw(janvier février mars avril mai juin juillet août septembre octobre novembre décembre);
     
    my ($sec,$minute,$heure,$jour,$mois,$annee,$weekday,$ajour,$isdst) = localtime(time);
    	$annee = 1900+$annee;
     
    	if ($jour < 10) {$jour = "0".$jour;}
    	if ($mois < 10) {$mois= "0".$mois;}
    	if ($minute < 10) {$minute= "0".$minute}
     
    	my ($date_backup) = shift; # On affecte l'argument à la variable $date_backup
     
    	if ($date_backup eq "date_log"){
    		my $date_log = "$Ljour[$weekday] $jour $Lmois[$mois] $annee";
    		return $date_log;
    	}
    	$mois++;
    	if ($date_backup eq "date_backup"){
    		my $date_backup = "$annee.$mois.$jour";
    		return $date_backup;
    	}
    	if ($date_backup eq "date_full_backup"){
    		my $date_full_backup = "$annee.$mois.$jour"."_"."$heure\:$minute";
    		return $date_full_backup;
    	}
    	if ($date_backup eq "heure_backup"){
    		my $heure_backup = "$heure\:$minute";
    		return $heure_backup;
    	}
    }
    #
    sub Archive_Tar {
    	my $tar = `tar -cf $path_backup\/$archive_name *`;
    	if ($? != 0) {
    		print ("\t[Erreur] Création de l'archive TAR impossible : $!\n");
    	}
    }
    #/*======================================================================*\
    #||
    #||      Fichier : backup.v.1.3.0.pl
    #||                                                                          Version : 1.3.0
    #\*======================================================================*/

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Je pense qu'il y a un soucis de portée pour tes deux variables.

    As-tu la possibilité de déclarer tes deux variables $path_backup et $archive_name au début du script sans que ça cause préjudice au bon fonctionnement de ton script ?

    Ah, et sinon j'ai vu une faute, cette boucle là doit poser un soucis au lancement de Perl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $domaine (key (%domaine)) {
    Il manque un 's' à la fonction key :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $domaine (keys (%domaine)) {

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Ha oui le "S" ^^. Merci.

    Si je déclare my $path_backup avant la boucle, je perds le côté dynamique de ma variable.

    Une variable déclaré dans une boucle reste une variable globale ?

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Je vais tenter de passer mes deux variables qui posent problème en argument à ma fonction pour voir si cela change quelque chose.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Points : 712
    Points
    712
    Par défaut
    Citation Envoyé par cassis2k Voir le message
    Ha oui le "S" ^^. Merci.

    Si je déclare my $path_backup avant la boucle, je perds le côté dynamique de ma variable.

    Une variable déclaré dans une boucle reste une variable globale ?
    Ta variable ne sera pas moins dynamique hors de la boucle.
    Tu mets ton my en dehors du for, et après tu fait les itérations (simplement, tu remets pas le my).

    D'une manière générale, la portée d'une variable se limite à la portion de code comprise entre les deux accolades qui encadrent ta variable. Et c'est donc clair que ta variable n'atteint pas les fonctions.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Heu, j'ai raté un chapitre de mon bouquin avec l'histoire des accolades ??!

    mon problème est que je ne peux pas déclarer $path_backup avant puisque j'utilise une variable initialisée par ma boucle..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach my $domaine (keys (%domaine)) {
            my $path_backup = "/home/$domaine/backup";

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Bon tu as des problèmes de portées mais ce n'est pas ça la vraie question... C'est plutôt : Pourquoi passes-tu par des variables globales plutôt que par des paramètres à tes fonctions ?
    Les variables globales sont à éviter comme la peste tant qu'on en a pas besoin, or les utiliser dans ton cas te complique la vie plus qu'autre chose !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub tar_pwd_in_file {
       my $path_archive = shift;
       system("tar -cf $path_archive *")
          and warn "\t[Erreur] Création de l'archive TAR impossible : $!\n";
    }
    Et l'utilisation :
    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
    foreach my $domaine (keys (%domaine)) {
      my $path_backup = "/home/$domaine/backup";
      if (-w $path_backup) {
        chdir($path_backup);
        #
        # Sauvegarde des fichiers
        #
        my $path_http = "/home/$domaine/http";
        if (-r $path_http){
          chdir($path_http);
          #
          my $archive_name = "backup.fichiers.".TimeBackup("date_backup").".tar";
          tar_pwd_in_file( "$path_backup/$archive_name" );
          #
          chdir($path_backup);
        }
        else {
          warn "[erreur] Le répertoire $path_http ne peut pas être lu.\n";
        }
      }
      else {
        die "[erreur fatale] Le répertoire $path_backup ne peut être utilisé.";
      }
    }
    En bref écrit du Perl, pas du shell abâtardi... (Déjà ce serait plus propre d'utiliser le module Archive::Tar à la place, mais pour un script vite fait c'est ok)

    --
    Jedaï

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ah oui, et Time_Backup....
    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
    use locale;
    use POSIX qw(strftime);
     
     
    my %formats = (
    	       date_log => '%A %d %B %Y',
    	       date_backup => '%Y.%m.%d',
    	       date_full_backup => '%Y.%m.%d_%H:%M',
    	       heure_backup => '%H:%M',
    );
     
    sub time_string {
      my $format = shift;
     
      if( exists $formats{$format} ) {
        return strftime($formats{$format}, localtime);
      }
      else {
        die "[erreur fatale] Le format de date '$format' n'est pas reconnu.\n";
      }
    }
    --
    Jedaï

  11. #11
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Bon tu as des problèmes de portées mais ce n'est pas ça la vraie question... C'est plutôt : Pourquoi passes-tu par des variables globales plutôt que par des paramètres à tes fonctions ?
    Parce que dans le bouquin..
    En tout cas je prends note de toutes vos remarques et je vais corriger ça

    En savoir plus sur la porté des variables, merci thierry.chich
    Pas de commandes système si un module existe
    Passer mes arguments à la fonction
    Décortiquer la fonction Time_Backup de Jedai

    Merci à tous pour vos lumières.

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

Discussions similaires

  1. Fonction et variables globales
    Par hacksi dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2008, 13h07
  2. Appeler une variable globale dans la fonction eval
    Par Romanops dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2007, 04h24
  3. fonctions et variables globales
    Par lemilig dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 11/07/2007, 17h57
  4. Variable Globale dans une fonction
    Par rekiem71 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 18/01/2007, 17h12
  5. Variables globales dans une fonction?
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2006, 01h53

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