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 :

conseil pour un script perl


Sujet :

Langage Perl

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut conseil pour un script perl
    bonjour
    CLASS CL-10A-BDD *NULL* 0 701000 0 *NULL*
    NAMES
    INFO 0 0 0 0 *NULL* 0 0 2147483647 1 0 0 0 0 0 0 0 0 0 1321436181 716AF15E103611E194170021284F59EA 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 3 9969
    KEY *NULL*
    BCMD *NULL*
    RCMD *NULL*
    RES VSU-op10aws01-P2A *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    POOL DDR-B-P2A-R3 NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup
    FOE 0 0 0 0 0 0 0 0 0 0
    SHAREGROUP *ANY*
    DATACLASSIFICATION *NULL*
    CLIENT op10aws01-adm Linux RedHat2.6 0 0 0 0 *NULL*
    INCLUDE /oradata/P10AAND/adm
    INCLUDE /oradata/P10AAND/u01
    INCLUDE /oradata/P10AAND/u02
    INCLUDE /oradata/P10AAND/u03
    INCLUDE /oradata/P10AAND/u04
    INCLUDE /oradata/P10AAND/u05
    INCLUDE /oradata/P10AAND/e01
    SCHED SCH-10A-BDD-FR3 0 1 604800 3 0 0 0 *NULL* 0 0 0 0 0 0 -1 0
    SCHEDWIN 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    SCHEDRES *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDPOOL *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDRL 3 1 1 1 1 1 1 1 1 1
    SCHEDFOE 0 0 0 0 0 0 0 0 0 0
    SCHEDSG *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHED SCH-10A-BDD-FR1 0 1 604800 1 0 0 0 *NULL* 0 0 0 0 0 0 -1 0
    SCHEDWIN 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    SCHEDRES *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDPOOL DDR-B-P2A-R1 *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDRL 1 1 1 1 1 1 1 1 1 1
    SCHEDFOE 0 0 0 0 0 0 0 0 0 0
    SCHEDSG *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    Et à partir de là je dois générer cela
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    je serais d'avis de partir avec un
    SWITCH:
    et de tester le 1er champ.
    Si j'ai le mot CLASS je récupère le champ suivant et cela correspond à ma clé
    Si j'ai le mot POOL je récupère le champ suivant etc etc
    Est-ce que cette façon de faire est correcte?
    D'avance merci

  2. #2
    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
    Aucune idée si tu ne précises pas quelles sont les règles qui te permettent de passer de tes données en entrée à tes donnés en sortie.

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Pour information
    Le fichier en entrée est généré avant le lancement du script.
    l'ordre des lignes est identique à ce que j'ai déjà envoyé.
    Sinon, voici une partie de mes reflexions
    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;
     
    my $fic1="fichier_en_entreel";
    my $fic2_out="fichier_en_sortie";
    my $police;
    my $volpool;
    my $include;
    my $schedule;
     
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic1\n";
    while (<fic1>)
          {
            my $line=$_;
            my @infolist=split;
            SWITCH :{
               if ( $line =~ /^CLASS/ ) {
               $police = $infolist[1];
               last SWITCH;
               }
               if ( $line =~ /^POOL/ ) {
               $volpool = $infolist[1];
               last SWITCH;
               }
               if ( $line =~ /INCLUDE/ ) {
               $include = $infolist[1];
               last SWITCH;
               }
               if ( $line = /^SCHED/ ) {
               $schedule = $infolist[1];
               last SWITCH;
               }
            }
    print " police $police volume pool $volpool schedule $schedule repertoire $include trouvee dans le fichier $fic1\n" ;
    }
    close $fic1;

  4. #4
    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
    Eh bien, si ça marche, pourquoi pas? Mais j'ai un doute...

    Pour commencer, j'enlèverai ton étiquette SWITCH, qui ne sert à rien. Quelque chose comme cela serait plus clair à mon avis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (<fic1>)
          {
            my @infolist=split;
            if ( /^CLASS/ ) {
               $police = $infolist[1];
               next;
            }
            if ( $line =~ /^POOL/ ) {
               $volpool = $infolist[1];
               next;
             }
             # ...
    Ou même ceci:

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $fic1="fichier_en_entreel";
    my $fic2_out="fichier_en_sortie";
    my ($police, $volpool, $include, $schedule);
    while (<fic1>) {
         my @infolist=split;
         $police = $infolist[1] and next if /^CLASS/;
         $volpool = $infolist[1] and next if /^POOL/;
         $include = $infolist[1] and next if /^INCLUDE/;
         if (/^SCHEDULE/) {
               $schedule = $infolist[1];
               print ...
         }
    }
    N'oublie pas d'ajouter le 'use warnings;', ça te fera gagner du temps pour repérer certains bugs.

    Cela dit, le principal problème de ton code est l'endroit (ou le moment) où tu fais ton print. Je ne suis pas sûr que ça fasse ce que tu désires. Mais comme tu n'as toujours pas expliqué ce que tu veux, je n'en sais trop rien...

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Bonjour
    Merci à @Lolo78 pour ton aide.
    Comme je disais dans mon premier message c'est la ligne qui commence par le mot CLASS qui détermine le début de chaque enregistrement.

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    J'ai un probleme sur le script.
    En effet au niveau du résultat, les informations sont décalées.
    police AHI volume pool schedule repertoire trouvee dans le fichier /home/infsvg/log/bpplist_all
    police CL-02G-APPLI volume pool DDR-B-P1A-R1 schedule test repertoire /images trouvee dans le fichier /home/infsvg/log/bpplist_all
    Pour la deuxième ligne, le nom de police est bonne mais j'ai les informations qui devrait apparaitre dans la première ligne.
    Voici le script utilisé
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $fic1="fichier_en_entre";
    my $fic2_out="fichier_en_sortie";
    my ($police, $volpool, $include, $schedule);
     
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic1\n";
    while (<fic1>)
          {
            my @infolist=split;
               $schedule = $infolist[1] and next if /^SCHED /;
               $volpool = $infolist[1] and next if /^POOL/;;
               $include = $infolist[1] and next if /^INCLUDE/;
               if ( /^CLASS / ) {
               $police = $infolist[1];
               print " police $police volume pool $volpool schedule $schedule repertoire $include trouvee dans le fichier $fic1\n" ;
               }
           }
    close $fic1;

  7. #7
    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
    Intéressant. Si je comprends bien, on ne s'intéresse qu'à la première valeur suivant chaque clé, certaines clés (INCLUDE) ont plusieurs valeurs, il n'y a qu'un SCHEDPOOL par SCHED, et on peut générer une ligne de sortie dès qu'on a lu SCHEDPOOL. La petite difficulté consiste à utiliser la valeur de POOL lorsque SCHEDPOOL est *NULL*.

    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
    Taisha:~/tttmp $ cat xtract.pl
    use strict;
    use warnings;
    use feature 'say';
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        %h = () if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
    	$_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
    	say join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    	pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }	    
    }
    Taisha:~/tttmp $ perl xtract.pl datafile
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    Taisha:~/tttmp $ perl xtract.pl datafile | diff -b - expected
    Taisha:~/tttmp $
    Le programme ci-dessus supporte plusieurs CLASS dans le fichier d'entrée (ou bien, de manière équivalente, plusieurs fichiers passés en paramètre sur la ligne de commande).

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Merci @cmcmc

    Très intéressant, ton script. Tu pourrais m'en dire un peu plus sur
    Mais apparemment, cela n'existe pas avec un perl en version 5.8.4 car ce paramètre a été ajouté dans la version 5.10. Et que cela correspond à un print améliorer (Merci Google)
    Il me reste à adapter le script en remplaçant la commande say

  9. #9
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Quand je lance le script de @cmcmc
    J'ai le message d'erreur suivant
    Can't use string ("SCHEDPOOL *NULL* *NULL* *NULL* *") as an ARRAY ref while "strict refs" in use at ./test2.pl line 13, <> line 18
    Si quelqu'un a une idée, je suis preneur. D'avance merci
    Information complémenntaire.
    Il peut arriver qu'il n'y est pas de ligne
    INCLUDE
    Exemple
    CLASS CL-02G-APPLI *NULL* 0 701000 0 *NULL*
    NAMES
    INFO 0 0 0 0 *NULL* 0 0 2147483647 1 0 0 0 0 0 0 0 0 0 1332499947 249997F05C7A11E1BD280021284F59EA 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 3 8
    KEY *NULL*
    BCMD *NULL*
    RCMD *NULL*
    RES SUG-10.64 *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    POOL DDR-O-P1A-R3 NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup
    FOE 0 0 0 0 0 0 0 0 0 0
    SHAREGROUP *ANY*
    DATACLASSIFICATION Gold
    CLIENT op02gws5-s Linux RedHat2.6 0 0 0 0 *NULL*
    CLIENT ua02gws1-s Linux RedHat2.6 0 0 0 0 *NULL*
    SCHED SCH-02G-APPLI-R3 2 1 604800 3 0 0 0 *NULL* 0 0 0 0 0 0 -1 0
    SCHEDWIN 0 604800 0 0 0 0 0 0 0 0 0 0 0 0
    SCHEDRES *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDPOOL *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDRL 3 1 1 1 1 1 1 1 1 1
    SCHEDFOE 0 0 0 0 0 0 0 0 0 0
    SCHEDSG *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*

  10. #10
    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
    ho la laaaa... 5.8.4 ? ça ne nous rajeunit pas... Normalement je suis en 5.16 ou 5.18 mais là j'ai testé en 5.10.1 (mon plus ancien perl sur ma machine courante). Je n'ai pas le temps d'installer un perl 5.8.4 (si j'y arrive...). J'essaierai de jeter un coup d'oeil plus tard. Bon courage...

    Par ailleurs pour gérer des CLASS sans INCLUDE il faut modifier l'initialisation de %h comme en ligne 10 ci-dessous

    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
    Taisha:~/tttmp $ cat xtract.pl
    use strict;
    use warnings;
    use feature 'say';
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        %h = (INCLUDE => []) if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
    	$_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
    	say join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    	pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }	    
    }
    Taisha:~/tttmp $ perl xtract.pl datafile datafile2
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-02G-APPLI;SCH-02G-APPLI-R3;DDR-O-P1A-R3
    Taisha:~/tttmp $

  11. #11
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Malheureusement @cmcmc, je suis obligé de faire avec ce que je trouve sur les machines.
    Sinon, je viens de tester sur mon PC avec une version 5.16 cela fonctionne.
    Mais malheureusement, il faut que je trouve une solution avec la version 5.8.4

  12. #12
    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
    Je ne sais pas quelle construction du script n'est pas appréciée par ton perl... Essaye d'ajouter des print de debug pour comprendre ce qui se passe, comme ci-dessous par exemple, et regarde si tu obtiens la même chose que moi...

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    Taisha:~/tttmp $ cat xtract.pl
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        %h = (INCLUDE => []) if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
    	print Dumper(\%h);
    	$_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
    	print join(';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)}), "\n";
    	pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }
    }
    Taisha:~/tttmp $ perl xtract.pl datafile datafile2
    $VAR1 = {
              'POOL' => [
                          'DDR-B-P2A-R3'
                        ],
              'SCHEDWIN' => [
                              '0'
                            ],
              'RCMD' => [
                          '*NULL*'
                        ],
              'SCHEDPOOL' => [
                               '*NULL*'
                             ],
              'KEY' => [
                         '*NULL*'
                       ],
              'CLASS' => [
                           'CL-10A-BDD'
                         ],
              'DATACLASSIFICATION' => [
                                        '*NULL*'
                                      ],
              'NAMES' => [
                           undef
                         ],
              'SHAREGROUP' => [
                                '*ANY*'
                              ],
              'RES' => [
                         'VSU-op10aws01-P2A'
                       ],
              'SCHED' => [
                           'SCH-10A-BDD-FR3'
                         ],
              'INFO' => [
                          '0'
                        ],
              'INCLUDE' => [
                             '/oradata/P10AAND/adm',
                             '/oradata/P10AAND/u01',
                             '/oradata/P10AAND/u02',
                             '/oradata/P10AAND/u03',
                             '/oradata/P10AAND/u04',
                             '/oradata/P10AAND/u05',
                             '/oradata/P10AAND/e01'
                           ],
              'CLIENT' => [
                            'op10aws01-adm'
                          ],
              'SCHEDRES' => [
                              '*NULL*'
                            ],
              'FOE' => [
                         '0'
                       ],
              'BCMD' => [
                          '*NULL*'
                        ]
            };
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    $VAR1 = {
              'SCHEDRL' => [
                             '3'
                           ],
              'POOL' => [
                          'DDR-B-P2A-R3'
                        ],
              'SCHEDWIN' => [
                              '0',
                              '0'
                            ],
              'RCMD' => [
                          '*NULL*'
                        ],
              'SCHEDPOOL' => [
                               'DDR-B-P2A-R1'
                             ],
              'KEY' => [
                         '*NULL*'
                       ],
              'CLASS' => [
                           'CL-10A-BDD'
                         ],
              'DATACLASSIFICATION' => [
                                        '*NULL*'
                                      ],
              'NAMES' => [
                           undef
                         ],
              'SHAREGROUP' => [
                                '*ANY*'
                              ],
              'SCHEDFOE' => [
                              '0'
                            ],
              'RES' => [
                         'VSU-op10aws01-P2A'
                       ],
              'SCHED' => [
                           'SCH-10A-BDD-FR1'
                         ],
              'INFO' => [
                          '0'
                        ],
              'INCLUDE' => [
                             '/oradata/P10AAND/adm',
                             '/oradata/P10AAND/u01',
                             '/oradata/P10AAND/u02',
                             '/oradata/P10AAND/u03',
                             '/oradata/P10AAND/u04',
                             '/oradata/P10AAND/u05',
                             '/oradata/P10AAND/e01'
                           ],
              'CLIENT' => [
                            'op10aws01-adm'
                          ],
              'SCHEDRES' => [
                              '*NULL*',
                              '*NULL*'
                            ],
              'FOE' => [
                         '0'
                       ],
              'BCMD' => [
                          '*NULL*'
                        ],
              'SCHEDSG' => [
                             '*NULL*'
                           ]
            };
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    $VAR1 = {
              'POOL' => [
                          'DDR-O-P1A-R3'
                        ],
              'SCHEDWIN' => [
                              '0'
                            ],
              'RCMD' => [
                          '*NULL*'
                        ],
              'SCHEDPOOL' => [
                               '*NULL*'
                             ],
              'KEY' => [
                         '*NULL*'
                       ],
              'CLASS' => [
                           'CL-02G-APPLI'
                         ],
              'DATACLASSIFICATION' => [
                                        'Gold'
                                      ],
              'NAMES' => [
                           undef
                         ],
              'SHAREGROUP' => [
                                '*ANY*'
                              ],
              'SCHED' => [
                           'SCH-02G-APPLI-R3'
                         ],
              'RES' => [
                         'SUG-10.64'
                       ],
              'INFO' => [
                          '0'
                        ],
              'INCLUDE' => [],
              'SCHEDRES' => [
                              '*NULL*'
                            ],
              'CLIENT' => [
                            'op02gws5-s',
                            'ua02gws1-s'
                          ],
              'FOE' => [
                         '0'
                       ],
              'BCMD' => [
                          '*NULL*'
                        ]
            };
    CL-02G-APPLI;SCH-02G-APPLI-R3;DDR-O-P1A-R3
    Taisha:~/tttmp $

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    voici le resultat du script
    $VAR1 = {
    'POOL' => [
    'DDR-B-P1A-R1'
    ],
    'SCHEDWIN' => [
    '0'
    ],
    'RCMD' => [
    '*NULL*'
    ],
    'SCHEDPOOL' => [
    '*NULL*'
    ],
    'KEY' => [
    '*NULL*'
    ],
    'CLASS' => [
    'AHI'
    ],
    'DATACLASSIFICATION' => [
    '*NULL*'
    ],
    'NAMES' => [
    undef
    ],
    'SHAREGROUP' => [
    '*ANY*'
    ],
    'RES' => [
    'VSU-opclpdb1-P1A'
    ],
    'SCHED' => [
    'test'
    ],
    'INFO' => [
    '0'
    ],
    'INCLUDE' => [
    '/images',
    '/images'
    ],
    'CLIENT' => [
    'opclpdb1-adm'
    ],
    'SCHEDRES' => [
    '*NULL*'
    ],
    'FOE' => [
    '0'
    ],
    'BCMD' => [
    '*NULL*'
    ]
    };
    Can't use string ("SCHEDPOOL *NULL* *NULL* *NULL* *") as an ARRAY ref while "strict refs" in use at ./test2.pl line 15, <> line 18.
    voici le script
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        %h = (INCLUDE => []) if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
            print Dumper(\%h);
            $_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
            print "join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)}\n";
            pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }
    }
    Pour controle

  14. #14
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    C'est mon print qui n'est pas bon
    si je remplace la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)}\n";
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    Cela fonctionne mais il n'y a plus de retour à ligne...

  15. #15
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Nouveau test
    Maintenant j'ai bien des retours chariots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "\n",join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    Il reste deux problèmes
    Un retour à la ligne au début (en trop)
    Et j'aimerais lorsque il n'y a pas l'information INCLUDE de rajouter en fin de ligne (none)

  16. #16
    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
    On a deux valeurs à passer à print : le résultat du join, et "\n". On peut pour cela parenthéser explicitement le join, comme proposé dans mon message de 14:56 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join(';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)}), "\n";
    On pourrait aussi écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print +(join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)}), "\n";
    le '+' sert à éviter que la ligne ci-dessus ne soit interprétée comme représentant deux expression séparées par une ',' : un appel fonctionnel à print, et la constante "\n":
    le compilateur avertirait d'ailleurs dans ce cas, et relèverait l'utilisation inutile d'une constante ("\n") en contexte void.

    alternativement, on peut introduire une variable intermédiaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $str = join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    print "$str\n";
    et si on est vraiment désespéré, on peut toujours ajouter un print

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    print "\n";
    On peut optimiser le script en ne considérant que les clés utiles (ligne 13, préparée par 5,6 et 7).

    Quant au '(none)', on peut le rajouter au moment de l'impression (ligne 17) :

    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
    Taisha:~/tttmp $ cat xtract.pl
    use strict;
    use warnings;
     
    my @wanted = qw(CLASS SCHED SCHEDPOOL INCLUDE);
    my @needed = qw(POOL);
    my %needed = map { $_ => 1 } @wanted, @needed;
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        next unless $needed{$key};
        %h = () if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
    	$h{INCLUDE} = ['(none)'] unless exists $h{INCLUDE};
    	$_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
    	print join(';', map { @$_ } @h{@wanted}), "\n";
    	pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }
    }
    Taisha:~/tttmp $ perl xtract.pl datafile datafile2
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-02G-APPLI;SCH-02G-APPLI-R3;DDR-O-P1A-R3;(none)
    Taisha:~/tttmp $
    Au final, plus que le fait qu'il fonctionne (y compris sous 5.8.4 ), ce script est à mon avis intéressant car il illustre nombre d'idiomes très utiles et spécifiques de perl, et qui valent le coup qu'on les maîtrise : utilisation de map, hash slices, topicalisation par for, etc. Vérifie que tu comprends vraiment ce que chaque ligne signifie. Par ailleurs il est conçu pour permettre des évolutions faciles. Il devrait être trivial de rajouter l'impression d'un champ.

  17. #17
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Un grand merci à @cmcmc

    Pour ton aide et pour tes explications, que je trouve très claire.


    Mais pour être franc je ne comprends pas tout

  18. #18
    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
    Citation Envoyé par JUSTIN Loïc Voir le message
    Mais pour être franc je ne comprends pas tout
    N'hésite pas à demander ce que tu ne comprends pas;


  19. #19
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Merci @lolo78 pour ton aide
    C'est parti pour les lignes que je ne comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %needed = map { $_ => 1 } @wanted, @needed;
    sinon pour la ligne du dessous, on ne prend que les deux premiers (logique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($key, $first) = split;
    Un rapport avec la 1ere ligne de code que j'indique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next unless $needed{$key};
    Pour la ligne suivante, on ajoute un enregistrement dans un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$h{$key}}, $first;
    Pour le print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join(';', map { @$_ } @h{@wanted}), "\n";
    Et la petite dernière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pop @{$h{$_}} for qw(SCHED SCHEDPOOL)
    le pop supprime un élément.
    Mais au fait tout cela que je comprends pas...

  20. #20
    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
    OK, commençons par la ligne sans doute la plus difficile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %needed = map { $_ => 1 } @wanted, @needed;
    Cette ligne prend tous les éléments des deux tableaux @wanted et @needed alimentés aux lignes précédentes et construit un hachage dont les clefs sont les éléments de ces deux tableaux et les valeurs le chiffre 1 (une valeur arbitraire qui a l'avantage d'être vraie si on la teste dans un contexte booléen).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        my ($key, $first) = split;
        next unless $needed{$key};
    Pour chaque ligne du tableau en entrée, on récupère les deux premiers mots. Si le premier mot ne fait pas parti des mots recherchés on passe directement à la ligne suivante, car $needed{$key} renvoie 1 (vrai) pour les mots recherchés (présents dans le hachage) et undef (faux) pour les autres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        %h = () if $key eq 'CLASS';
        push @{$h{$key}}, $first;
    Si le premier mot est 'CLASS', on crée un nouveau hachage %h à vide et l'on y ajoute une référence vers un tableau anonyme dont le premier élément est par exemple 'CL-10A-BDD'. %h a maintenant la même structure que si l'on l'avait initialisé comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %h = ( 'CLASS' => [ 'CL-10A-BDD',]);
    Le hachage %h va être alienté et utilisé progressivement tant que l'on ne rencontre pas une nouvelle ligne commençant par CLASS, qui remettrait le hachage à vide.

    Ensuite, si le premier mot est 'SCHEDPOOL':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $h{INCLUDE} = ['(none)'] unless exists $h{INCLUDE};
    le programme ajoute un nouvel élément au hachage %h, un tableau anonyme dont le premier élément est 'NONE', sauf s'il existe déjà un élément de clef 'INCLUDE' dand le hachage %h.

    %h a maintenant la même structure que si l'on l'avait initialisé comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %h = ( 'CLASS'   => [ 'CL-10A-BDD',],
           'INCLUDE' => ['none'], 
         );
    Maintenant que tu as une idée de la structure de données créée par le programme, un hash de tableaux anonymes, je te laisse essayer d'examiner et comprendre la suite.

    Je te conseille d'utiliser le debugger Perl et d'utiliser l'option 'x' pour examiner la structure de %h au fur et à mesure de l'exécution du code du programme. Tu comprendras beaucoup mieux ce qui se passe. N'hésite pas à redemander si des lignes de codes te paraissent mystérieuses.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Conseil pour un script de suppression de fichiers en double
    Par doc malkovich dans le forum Langage
    Réponses: 10
    Dernier message: 11/09/2013, 11h17
  2. Réponses: 1
    Dernier message: 29/05/2008, 14h16
  3. Besoin de quelques conseils pour un script java
    Par poussin544 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/03/2006, 10h41
  4. Réponses: 2
    Dernier message: 11/07/2002, 08h31
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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