Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Programmation et administration système
Programmation et administration système Vos questions sur les scripts d'administration système, création de compte utilisateur, socket, fork, ping, etc...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/03/2012, 21h59   #1
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
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 :
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
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2012, 22h09   #2
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2012, 22h16   #3
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
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)
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2012, 23h19   #4
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 09h32   #5
magicshark
Membre du Club
 
Homme
Développeur COBOL
Inscription : octobre 2011
Messages : 56
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur COBOL
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2011
Messages : 56
Points : 60
Points : 60
j'imagine que si tu rajoutes ceci à ton code tu trouveras toi même la réponse à ta question :

Code :
1
2
3
4
  use Data::Dumper;
#ton code
@res=split(/ +/,$command);
print Dumper(@test);
magicshark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 09h43   #6
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 11h12   #7
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
@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 :
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
Citation:
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.
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 11h20   #8
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
Autant pour moi magicshark

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

Donc maintenant j'ai 276 variables...

Code :
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' ??
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 11h56   #9
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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 :
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 12h00   #10
magicshark
Membre du Club
 
Homme
Développeur COBOL
Inscription : octobre 2011
Messages : 56
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur COBOL
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2011
Messages : 56
Points : 60
Points : 60
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
magicshark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 12h18   #11
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
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 :
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 :
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 !
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 13h18   #12
Beniou
Membre expérimenté
 
Avatar de Beniou
 
Homme
Inscription : novembre 2009
Messages : 357
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : novembre 2009
Messages : 357
Points : 509
Points : 509
Bonjour,

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

Code :
1
2
3
my $ip="192.168.10.12";
my $password="pass123";
my $user="admin";
Beniou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 13h39   #13
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
Bonjour,

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

Code :
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.
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 13h45   #14
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 13h52   #15
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
Je me base sur ton code Philou67430

Code :
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 :
$var{$key} = { pairwise { $a => $b } @col_names, @col_values };
Ligne 53 :

Code :
say "Key id0/1, Valeur1-2: ", $var{"id0/1"}->{"Valeur1-2"};
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 14h22   #16
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
Modifie ceci :
Code :
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 :
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 15h20   #17
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
Cela ne change pas

Même erreurs :

Code :
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.
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 15h32   #18
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 15h41   #19
seb-65
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 174
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 174
Points : 14
Points : 14
Citation:
Comme il n'est pas possible de savoir ce que retourne ta commande ssh
Si elle me retourne bien :

Code :
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.
seb-65 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 16h31   #20
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
Transforme cette ligne
Code :
foreach my $line (<$chan2>) {
en
Code :
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 :
      $var{$key} = { pairwise { $a => $b } @col_names, @col_values };
en
Code :
      $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é
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h50.


 
 
 
 
Partenaires

Hébergement Web