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 :

sauver un hash de array dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut sauver un hash de array dans un fichier
    Bonjour à tous,

    Y at-il moyen de sauver facilement un hash de array dans un fichier, en vue de le réimporter tel quel plus tard dans un autre programme ? Connaissez-vous des modules ?

    D'avance merci.

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    J'ai maintenant transformé mon tableau en hash de hash de array. Mais, je suppose que la question reste la même. Merci.

  3. #3
    Membre chevronné Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Par défaut
    Le plus simple et portable est sans doute Data::Dumper. En moins portable mais dans le core il y a Storable. Après il y a aussi YAML et JSON...

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci cmcmc, je vais y regarder et je reviens donner mon avis.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Juste en complément, Data::Dumper fait aussi partie des modules core.

  6. #6
    Membre chevronné Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Par défaut
    Un petit exemple vite fait avec Data::Dumper :
    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
    Taisha:~/perl/forum $ perl -E '
    my $h = { b => { c => { foo => 1, bar => 2 }}, a => [0 .. 3], d => [4, 6, 8, 10]};
    {
       use Data::Dumper;
       local ($Data::Dumper::Purity, $Data::Dumper::Terse) = (1,1);
       print Dumper($h);
    }' > h.dat
    Taisha:~/perl/forum $ cat h.dat
    {
              'a' => [
                       0,
                       1,
                       2,
                       3
                     ],
              'b' => {
                       'c' => {
                                'bar' => 2,
                                'foo' => 1
                              }
                     },
              'd' => [
                       4,
                       6,
                       8,
                       10
                     ]
            }
    Taisha:~/perl/forum $ perl -MData::Dump -e 'my $h = do "h.dat"; dd $h'
    { a => [0 .. 3], b => { c => { bar => 2, foo => 1 } }, d => [4, 6, 8, 10] }
    Taisha:~/perl/forum $
    note que l'utilisation de Data::Dump ci-dessus n'a rien à voir avec la sérialisation/désérialisation de $h: je l'utilise juste pour la fonction dd qui est pratique et compacte pour les impressions de debug. La sérialisation est faite par et la désérialisation par

  7. #7
    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
    Il existe bien le module Storable, mais j'avoue également utiliser les facilités de Data::Dumper, qui en outre, permet d'avoir accès, offline, au contenu de la structure à l'aide d'un simple éditeur de texte. La manipulation d'exportation est très simple, celle d'importation un peu moins (si l'on intègre la gestion des exceptions avec les tests de $@, $! et le retour de la fonction do), mais bien documentée dans l'aide de la fonction do (avec notamment un exemple de programme).

  8. #8
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Bonjour à vous deux,

    Merci pour vos réponses :

    Voila, j'ai adapté ... ça fonctionne vraiment bien, un grand merci.
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    use Data::Dumper;
    local ($Data::Dumper::Purity, $Data::Dumper::Terse) = (1,1);
     
     
    my $h = { b => { c => { foo => 1, bar => 2 }}, a => [0 .. 3], d => [4, 6, 8, 10]};
     
    my $file = 'test.txt';
    open(my $fh, ">", $file)  or die "cannot create file : $!";	
    print $fh Dumper($h);
    close $fh;
     
     
    open(my $fh2, "<", $file)  or die "cannot open file : $!";	
    my $h2 = do "test.txt";
    close $fh2;
     
    print Dumper($h2);

    Comment choisir de mettre 1 ou de laisser le défaut ?
    $Data::Dumper::Purity or $OBJ->Purity([NEWVAL]) : Controls the degree to which the output can be evaled to recreate the supplied reference structures. Setting it to 1 will output additional perl statements that will correctly recreate nested references. The default is 0.

    $Data::Dumper::Terse or $OBJ->Terse([NEWVAL]) : When set, Data::Dumper will emit single, non-self-referential values as atoms/terms rather than statements. This means that the $VARn names will be avoided where possible, but be advised that such output may not always be parseable by eval.

    Bonne fin de journée,

  9. #9
    Membre chevronné Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Comment choisir de mettre 1 ou de laisser le défaut ?
    Je l'utilise personnellement comme ci dessus sans état d'âme sachant que je ne m'en sers que pour des structures potentiellement complexes mais pas auto-référentes... Donc purity est probablement overkill mais terse permet de ne pas utiliser de variables globales.

  10. #10
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci, j'ai encore quelques questions.
    Quelle est l'utilité d'une variable autoréférente ?
    A partir de quelle complexité de structure vaut-il mieux mettre purity à 1 ?
    Est-ce que la taille du tableau compte aussi dans cette complexité ?

    Bonne journée.

  11. #11
    Membre chevronné Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Merci, j'ai encore quelques questions.
    Quelle est l'utilité d'une variable autoréférente ?
    Je voulais parler d'une structure dont certains membres pointent sur d'autres de la structure, par exemple un arbre ou un graphe :
    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
    Taisha:~/perl/forum $ perl -E '
    my $a = { name => "alice" };
    my $b = { name => "bob", parent => $a };
    push @{$a->{children}}, $b;
    my $c = { name => "charles", parent => $b};
    push @{$b->{children}}, $c;
    my $d = { name => "dave", parent => $b};
    push @{$b->{children}}, $d;
    push @{$c->{siblings}}, $d;
    push @{$d->{siblings}}, $c;
    use Data::Dumper; print Dumper($a);
    say+"-"x50;
    use Data::Dump; dd $a'
    $VAR1 = {
              'name' => 'alice',
              'children' => [
                              {
                                'parent' => $VAR1,
                                'children' => [
                                                {
                                                  'name' => 'charles',
                                                  'parent' => $VAR1->{'children'}[0],
                                                  'siblings' => [
                                                                  {
                                                                    'parent' => $VAR1->{'children'}[0],
                                                                    'siblings' => [
                                                                                    $VAR1->{'children'}[0]{'children'}[0]
                                                                                  ],
                                                                    'name' => 'dave'
                                                                  }
                                                                ]
                                                },
                                                $VAR1->{'children'}[0]{'children'}[0]{'siblings'}[0]
                                              ],
                                'name' => 'bob'
                              }
                            ]
            };
    --------------------------------------------------
    do {
      my $a = {
        children => [
          {
            children => [
              {
                name => "charles",
                parent => 'fix',
                siblings => [{ name => "dave", parent => 'fix', siblings => ['fix'] }],
              },
              'fix',
            ],
            name => "bob",
            parent => 'fix',
          },
        ],
        name => "alice",
      };
      $a->{children}[0]{children}[0]{parent} = $a->{children}[0];
      $a->{children}[0]{children}[0]{siblings}[0]{parent} = $a->{children}[0];
      $a->{children}[0]{children}[0]{siblings}[0]{siblings}[0] = $a->{children}[0]{children}[0];
      $a->{children}[0]{children}[1] = $a->{children}[0]{children}[0]{siblings}[0];
      $a->{children}[0]{parent} = $a;
      $a;
    }
    Taisha:~/perl/forum $
    On voit que Data::Dumper et Data::Dump utilisent des méthodes différentes pour reconstituer la structure. $Data::Dumper::Terse = 1 ne fonctionnerait probablement pas dans ce cas.
    A partir de quelle complexité de structure vaut-il mieux mettre purity à 1 ?
    Aucune idée car je ne m'en sers pas pour des structures autoréférentes.
    Est-ce que la taille du tableau compte aussi dans cette complexité ?
    Pour des structures complexes mais pas autoréférentes je n'ai pas rencontré de limitation de taille.

  12. #12
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci beaucoup pour toutes ces explications, je peux clore le sujet.

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

Discussions similaires

  1. [PHP 5.4] Mettre le contenu d'un array dans un fichier
    Par aspkiddy dans le forum Langage
    Réponses: 9
    Dernier message: 06/03/2014, 23h56
  2. Ecriture/ Lecture d'une array dans un fichier
    Par Seth77 dans le forum C#
    Réponses: 4
    Dernier message: 19/03/2012, 22h39
  3. ecriture d'un array dans un fichier txt
    Par julien25 dans le forum MATLAB
    Réponses: 4
    Dernier message: 07/04/2009, 23h19
  4. sauver et lire un png dans un fichier xml
    Par Papy214 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/09/2008, 12h24
  5. Réponses: 3
    Dernier message: 21/11/2007, 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