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 :

Utilisation de références, petit soucis


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 53
    Par défaut Utilisation de références, petit soucis
    Bonjour,

    j'ai un soucis en utilisant les références sur un HASH, j'essaie d'apporter des modification au HASH %HEA dans la fonction identify_hea

    Je pensais avoir bien suivi la FAQ mais j'ai du râter une subtilité

    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
     
    #!/usr/bin/perl 
    use strict; use warnings;
    use Data::Dumper;
     
    sub get_attr_hea {
    	my ( $SYSTEM_NAME )= shift;
    	my $i=0;
    	my %val=();
    	foreach (`$CMD{lshwres} -r hea -m $SYSTEM_NAME --rsubtype phys --level port`){
    		chomp;
    		foreach (split /,/) {
    			my($key,$value)=split /\=/;
    			$val{$key}{$i}=$value;
    		}
    		$i++;
    	}
    	return %val;
    }
     
    sub identify_hea {
    	my ($ref) = @_;
    	my %HEA = %$ref;
    	foreach (`lsdev -Ccadapter -t ethernet -F "name,physloc"`) {
    		chomp;
    		my ($name,$physloc) = split /,/ ;
    		foreach (sort keys %{$HEA{phys_port_loc}}) {
    			%{$ref{adapter}{$_}}=$name if $physloc =~ /-$HEA{phys_port_loc}{$_}$/;
    		}
    	}
    }
     
     
    my %HEA = get_attr_hea($SYSTEM_NAME);
     
    identify_hea(\%HEA);
    C'est cette ligne qui retourne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %{$ref{adapter}{$_}}=$name if $physloc =~ /-$HEA{phys_port_loc}{$_}$/;
    ./reseau_vio.pl
    Global symbol "%ref" requires explicit package name at ./reseau_vio.pl line 76.
    Execution of ./reseau_vio.pl aborted due to compilation errors.
    Je suis en Perl 5.8.8.

    Merci !

  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
    Lors que tu préfixes une variable avec %, c'est que tu affectes le hash complet (donc que tu l'utilises comme une liste complète de clés/valeurs, dans un contexte de liste donc).
    Or ici, tu souhaites mettre à jour un scalaire, à savoir, UNE valeurs d'une clé du hash.

    La syntaxe est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ref{adapter}->{$_}=$name if $physloc =~ /-$HEA{phys_port_loc}{$_}$/;
    (on peut aussi écrire ou encore (et c'est plus juste) , mais lorsque c'est possible, ce qui n'est pas toujours le cas, je préfère l'écriture avec ->, qui rappelle, à la manière de C, que est une référence, et non un hash).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 53
    Par défaut
    Merci de ta réponse mais j'obtiens toujours ce message d'erreur

    Global symbol "%ref" requires explicit package name at ./reseau_vio.pl line 28.
    J'avoue ne pas comprendre ce message dans ce cas

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 53
    Par défaut
    Ah j'ai trouvé

    ceci ${$ref}{adapter}{$_} ou $$ref{adapter}{$_} ou encore ${$ref->{adapter}}{$_} fonctionne !

    Merci

  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
    Désolé, je n'ai pas regardé en profondeur comment était structuré ton arbre $ref...
    En effet, dans ta fonction, tu passes ton hash par référence, et il convient donc toujours de déréférencer d'abord pour obtenir une valeur de hashage : $ref->{adapter} (ou ${$ref}{adapter}).

    Encore désolé.

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

Discussions similaires

  1. Petits soucis avec utilisation de NMHTTP->Post
    Par motomoto dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/06/2007, 10h26
  2. Petit soucis avec l'utilisation de RETVAL
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 05/04/2007, 18h59
  3. [MAVEN] Petits soucis d'utilisation
    Par julienOriano dans le forum Maven
    Réponses: 15
    Dernier message: 23/06/2006, 15h50
  4. Réponses: 6
    Dernier message: 21/01/2004, 14h25
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 17h52

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