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 :

Difference entre deux syntaxe


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
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut Difference entre deux syntaxe
    Bonjour,

    Pourriez vous me dire pourquoi la syntaxe suivant ne fonctionne pas ?

    Merci pour vos eclairs

    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
    
    my @champs = qw/ MPT LVNAME BLK NBPP USER GROUP VGNAME TAILLEMO PREDISK COMMENT /;
    my %filesys;
    my $ref_cr_fs ;
    
    open(IN, "cr_fs_ora.txt") or die("acces fichier donn\351es err : $!\n");
    while(<IN>)
    {
            next if ( $_ =~ /^$/ ) ;
            chomp() ;
            @filesys{ @champs } = split /\s+/, $_, 10;
            #print Dumper(%filesys) ;
    
            print "\t\t$filesys{VGNAME} => $filesys{MPT}\n";
           
            #Cette syntaxe fonctionne, j'ai vu dans un livre.
            push @{$ref_cr_fs->{$filesys{VGNAME}}} , { %filesys } ; 
    
            #Cette syntaxe ne fonctionne pas... Pourquoi ?
            push @{$ref_cr_fs->{$filesys{VGNAME}}} , %filesys ;
    
    }

  2. #2
    Expert confirmé
    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
    Par défaut
    Dans un tableau ou un hash, on ne peut mettre que des scalaires. Autrement dit on ne peut pas y mettre un tableau ou un hash comme tu essaies de le faire ici (ça ne plantera pas, mais ça ne fera pas ce que tu veux). On peut mettre un nombre, une chaîne de caractère ou une référence. La référence peut pointer sur un tableau ou un hash, et c'est ainsi qu'on construit des structures de données complexes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$ref_cr_fs->{$filesys{VGNAME}}} , %filesys ;
    Cette ligne rajoute l'ensemble des éléments de %filesys à @{$ref_cr_fs->{$filesys{VGNAME}}} dans un ordre quelconque (mais avec chaque clé suivie de sa valeur) par exemple s'il y a (hello => "world", bye => "all") dans %filesys, les éléments 'bye', 'all', 'hello' et 'world' pourrait être ajouté dans cet ordre à la fin du tableau @{$ref_cr_fs->{$filesys{VGNAME}}.
    On dit que %filesys est "aplati" (flattened) en contexte de liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$ref_cr_fs->{$filesys{VGNAME}}} , { %filesys } ;
    Ici, les { } construisent une nouvelle référence anonyme vers un hash dont le contenu est copié depuis %filesys.
    Attention la syntaxe suivante peut poser problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$ref_cr_fs->{$filesys{VGNAME}}} , \%filesys ;
    Ici on prend directement une référence au hash %filesys. Celui-ci étant déclaré (de façon incorrecte à mon avis) en dehors de la boucle, son contenu est changé à chaque boucle, et à la fin de la boucle, notre tableau ne comportera que des références vers l'actuel %filesys, autrement dit il aura les mêmes valeurs dans toutes ses cases, les dernières à avoir été entrées dans %filesys.....

    Pour éviter cela, il est préférable de toujours utiliser la première syntaxe avec les {}, ou de déclarer la variable dont on prend la référence dans la boucle où on la prend (de façon à ce qu'une nouvelle variable soit créée à chaque itération).

    --
    Jedaï

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    Merci beaucoup pour ces explications eclairées.

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

Discussions similaires

  1. Différence entre deux listes
    Par Celelibi dans le forum Linux
    Réponses: 4
    Dernier message: 26/04/2006, 09h46
  2. Réponses: 7
    Dernier message: 03/02/2006, 13h50
  3. [EXCEL] difference entre deux fichiers
    Par Mokhtar BEN MESSAOUD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/01/2006, 11h12
  4. [PIL] Difference entre deux images
    Par t_om84 dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 26/12/2005, 12h45
  5. difference entre deux requetes
    Par rdams dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/12/2005, 09h38

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