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

Programmation et administration système Perl Discussion :

récupérer valeurs dans variables


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut récupérer valeurs dans variables
    Bonsoir,

    Dans mon script PERL je voudrais récupèrer et afficher certaines valeurs stocké dans une variable.

    La variable est retourné de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    N°           Valeur1-1           Valeur2-1          Valeur3-1        Valeur4-1
    id0/1         1370380983         224275        5977182       11519416
    id0/2         2950137424       10842680        5901202       11460799
     
    N°           Valeur1-2           Valeur2-2          Valeur3-2        Valeur4-2
    id0/1         1092839685         132161        5280599        9771119
    id0/2         35382434282       89595306        1172398         933271
    Je cherche à afficher le N° id0/2 et récupérer les valeurs Valeur1-1 et Valeur1-2.

    Je sèche complétement

    Merci pour le coup de pouce

  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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Qu'appelles-tu "quelques valeurs stocké dans une variable" ?
    Tu veux analyser le fichier texte que tu as mis en exemple et récupérer une valeur à l'intersection d'une ligne et d'une colonne ?
    Si oui, pourrais-tu indiquer quel est le séparateur de colonne ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Bonsoir Philou67430,

    Non en fait c'est le résultat d'une commande que je place dans une variable.

    Le sépateur est plusieurs espace (@res=split(/ +/,$command)

  4. #4
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    J'ai toujours du mal à comprendre. Tu as un début de script écrit ? quels sont les données d'entrée du script (paramètre d'appel) ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    j'imagine que si tu rajoutes ceci à ton code tu trouveras toi même la réponse à ta question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      use Data::Dumper;
    #ton code
    @res=split(/ +/,$command);
    print Dumper(@test);
    Pourquoi faire simple quand on peut faire compliqué.

  6. #6
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Je comprends encore moins ton message, magicshark
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    @magicshark

    Oula En fait Dumper place bien les valeurs dans les variables... Mais...

    Comment récupérer les valeurs dans les variables car sur le parcours Dumper à créé 2467 variables

    Compliqué pour aller chercher la bonne valeur là.

    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
     
    id0/2';
    $VAR2435 = '';
    $VAR2436 = '';
    $VAR2437 = '';
    $VAR2438 = '';
    $VAR2439 = '';
    $VAR2440 = '';
    $VAR2441 = '';
    $VAR2442 = '39175893979';
    $VAR2443 = '';
    $VAR2444 = '';
    $VAR2445 = '';
    $VAR2446 = '';
    $VAR2447 = '';
    $VAR2448 = '';
    $VAR2449 = '94308410';
    $VAR2450 = '';
    $VAR2451 = '';
    $VAR2452 = '';
    $VAR2453 = '';
    $VAR2454 = '';
    $VAR2455 = '';
    $VAR2456 = '';
    $VAR2457 = '1188042';
    $VAR2458 = '';
    $VAR2459 = '';
    $VAR2460 = '';
    $VAR2461 = '';
    $VAR2462 = '';
    $VAR2463 = '';
    $VAR2464 = '';
    $VAR2465 = '';
    $VAR2466 = '943957';
    $VAR2467 = '
    @Philou67430
    quels sont les données d'entrée du script (paramètre d'appel) ?
    Mon script Perl établi une connexion SSH sur un serveur et lance une commande. Le retour de la commande est stocké dans ma variable pour pouvoir interpréter les résultats.

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Autant pour moi magicshark

    En fait je n'avais pas le bon split (/ / au lieu de / +/)

    Donc maintenant j'ai 276 variables...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id0/2';
    $VAR272 = '39183049336';
    $VAR273 = '94325734';
    $VAR274 = '1188159';
    $VAR275 = '944087';
    $VAR276 = '
    Le problème est comment faire pour accèder a la valeur '39183049336' ??

  9. #9
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Selon moi, tu dois analyser ligne à ligne ton résultat de la commande ssh, tout en renseignant un hash de hash comme un tableau à 2 dimensions dont la première clé est la première colonne (en oubliant les lignes de header) et la deuxième clé est la 1ere ligne de header, sauf la 1ere colonne).

    Peut-être quelque chose comme :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    use feature qw(:5.10);
    use List::MoreUtils qw(pairwise);
     
    my @ssh_return = split /\n/, <<'DATA';
    N°           Valeur1-1           Valeur2-1          Valeur3-1        Valeur4-1
    id0/1         1370380983         224275        5977182       11519416
    id0/2         2950137424       10842680        5901202       11460799
     
    N°           Valeur1-2           Valeur2-2          Valeur3-2        Valeur4-2
    id0/1         1092839685         132161        5280599        9771119
    id0/2         35382434282       89595306        1172398         933271
    DATA
     
    my %var;
    our ($a, $b);
     
    my @col_names;
    foreach my $line (@ssh_return) {
      chomp $line;
      if ($line =~ /^N°/) {
        @col_names = split /\s+/, $line;
        shift @col_names;
      }
      else {
        if (my @col_values = split /\s+/, $line) {
          my $key = shift @col_values;
          $var{$key} = { pairwise { $a => $b } @col_names, @col_values };
        }
      }
    }
     
    say "Key id0/1, Valeur1-2: ", $var{"id0/1"}->{"Valeur1-2"};
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    C'est quoi comme type de commande, la réponse est elle stocker dans une variable ou dans un tableau ?
    j'ai l'impression je me trompe surement que ton résultat est directement spliter alors que s'il récupère plusieurs ligne tu peux peut être commencer par boucler dessus afin de mieux organiser ta réponse et pourquoi pas la mettre dans une hash pour pouvoir l'exploiter facilement

    edit : philou te propose la même chose mais avec le code
    Pourquoi faire simple quand on peut faire compliqué.

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Merci à vous deux !

    Je débute avec Perl c'est pas encore facile pour moi

    Quand j'utilise use strict; j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Global symbol "$ip" requires explicit package name at ./test.pl line 12.
    Global symbol "$password" requires explicit package name at ./test.pl line 13.
    Global symbol "$user" requires explicit package name at ./test.pl line 14.
    Mon fichier test.pl :

    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
     
    #!/usr/bin/perl
    #
     
    use Net::SSH2;
    use strict;
    use warnings;
     
    use feature qw(:5.10);
    use List::MoreUtils qw(pairwise);
    #use Data::Dumper;
     
    $ip="192.168.10.12";
    $password="pass123";
    $user="admin";
    $verif=$password;
    Pourquoi "requires explicit package name " ?? C'est une variable !

  12. #12
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Quand on utilise le pragma 'use strict' il faut, entre autre, déclarer ses variables avec le mot-clé 'my'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $ip="192.168.10.12";
    my $password="pass123";
    my $user="admin";

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Ok je déclare mes variables avec "my" mais j'obtiens d'autres erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Use of uninitialized value in anonymous hash ({}) at ./test.pl line 48.
    Use of uninitialized value in say at ./test.pl line 53.

  14. #14
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Là, faut que tu fournisses le reste du code (j'ai testé le code que j'ai fourni avec l'exemple que tu as donné, sans constater d'erreur).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Je me base sur ton code Philou67430

    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
     
    my $command="";
    $command.=$_ while (<$chan2>);
    my @res=split(/ +/,$command);
     
    my %var;
    our ($a, $b);
     
    my @col_names;
    foreach my $line (@res) {
      chomp $line;
      if ($line =~ /^N°/) {
        @col_names = split /\s+/, $line;
        shift @col_names;
      }
      else {
        if (my @col_values = split /\s+/, $line) {
          my $key = shift @col_values;
          $var{$key} = { pairwise { $a => $b } @col_names, @col_values };
        }
      }
    }
     
    say "Key id0/1, Valeur1-2: ", $var{"id0/1"}->{"Valeur1-2"};
    Ligne 48 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $var{$key} = { pairwise { $a => $b } @col_names, @col_values };
    Ligne 53 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    say "Key id0/1, Valeur1-2: ", $var{"id0/1"}->{"Valeur1-2"};

  16. #16
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Modifie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my $command="";
    $command.=$_ while (<$chan2>);
    my @res=split(/ +/,$command);
     
    my %var;
    our ($a, $b);
     
    my @col_names;
    foreach my $line (@res) {
    en ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my %var;
    our ($a, $b);
     
    my @col_names;
    foreach my $line (<$chan2>) {
    En fait, il est inutile de concaténer dans $command les lignes de résultat pour les spliter ensuite (d'autant que tu ne les splites pas avec le bon séparateur).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Cela ne change pas

    Même erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Use of uninitialized value in anonymous hash ({}) at ./test.pl line 48.
    Use of uninitialized value in say at ./test.pl line 53.

  18. #18
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Comme il n'est pas possible de savoir ce que retourne ta commande ssh, ajoute une ligne après le foreach pour afficher $line, que l'on puisse voir ce qui est retourné.
    (ou mieux, stocke ce résultat dans un fichier et poste le).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Points : 48
    Points
    48
    Par défaut
    Comme il n'est pas possible de savoir ce que retourne ta commande ssh
    Si elle me retourne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    N°           Valeur1-1           Valeur2-1          Valeur3-1        Valeur4-1
    id0/1         1370380983         224275        5977182       11519416
    id0/2         2950137424       10842680        5901202       11460799
     
    N°           Valeur1-2           Valeur2-2          Valeur3-2        Valeur4-2
    id0/1         1092839685         132161        5280599        9771119
    id0/2         35382434282       89595306        1172398         933271
    Je viens de faire un print $line; après le foreach et j'affiche bien le retour/résultat de la commande SSH.

  20. #20
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Transforme cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $line (<$chan2>) {
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (defined(my $line = <$chan2>)) {
    et renvoie le message d'erreur affiché.

    Je pense que le pb arrive sur les lignes vides, qui sont peut-être mal traitées.
    Essaye de changer cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          $var{$key} = { pairwise { $a => $b } @col_names, @col_values };
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          $var{$key} = { pairwise { $a => $b } @col_names, @col_values } if defined $key;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2015, 14h48
  2. [SUITE2] récupérer valeurs dans variables
    Par seb-65 dans le forum Programmation et administration système
    Réponses: 15
    Dernier message: 02/04/2012, 09h03
  3. [SUITE] récupérer valeurs dans variables
    Par seb-65 dans le forum Programmation et administration système
    Réponses: 14
    Dernier message: 28/03/2012, 17h35
  4. Récupérer valeur dans une variable globale
    Par zdig10 dans le forum VB.NET
    Réponses: 5
    Dernier message: 23/09/2011, 11h49
  5. Récupérer valeur dans un thread
    Par Nasky dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 07/06/2006, 21h37

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