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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    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 Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    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 603
    Par défaut
    Peux-tu montrer tout ton code ?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    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 Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    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 603
    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 confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    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 confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    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 émérite
    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
    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.

+ 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