Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Perl objet : comment récupérer les valeurs de variables d'instances ??

4 réponses
Avatar
Damien GUERIN
Bonjour,

j'ai un script perl et je cherche le moyen de récupérer les valeurs d'une
variable d'instance d'une librairie Perl dans laquelle il n'y a pas
d'accesseurs pour ces variables.
Je dois donc récupérer la valeur d'une variable sans modifier la librairie.
La librairie est la suivante, je cherche à récupérer la valeur de la
variable "a" sur un objet "$objet" correctement instancié dans mon script
perl.
J'ai essayé :$objet->{a}, $objet->{"a"},... Bref, je sais meme pas si c'est
possible !
Merci par avance pour votre aide.

package my_package;
use strict;
use base qw( my_parent_package);
use fields qw(a b c d);
use vars qw[ $VERSION ];
$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /: (\d+)\.(\d+)/;
1;

sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my %p = @_;
my $self = $class->SUPER::new(%p);
$self->{a} = $p{a};
$self->{b} = $p{b};
$self->{c} = $p{c};
$self->{d} = $p{d};
return $self;
}

4 réponses

Avatar
DominiX
ici même: Damien GUERIN a écrit
Bonjour,

j'ai un script perl et je cherche le moyen de récupérer les valeurs
d'une variable d'instance d'une librairie Perl dans laquelle il n'y a
pas d'accesseurs pour ces variables.
Je dois donc récupérer la valeur d'une variable sans modifier la
librairie. La librairie est la suivante, je cherche à récupérer la
valeur de la variable "a" sur un objet "$objet" correctement
instancié dans mon script perl.
J'ai essayé :$objet->{a}, $objet->{"a"},... Bref, je sais meme pas si
c'est possible !
Merci par avance pour votre aide.

package my_package;
use strict;
use base qw( my_parent_package);
use fields qw(a b c d);
use vars qw[ $VERSION ];
$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /: (d+).(d+)/;
1;

sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my %p = @_;
my $self = $class->SUPER::new(%p);
$self->{a} = $p{a};
$self->{b} = $p{b};
$self->{c} = $p{c};
$self->{d} = $p{d};
return $self;
}


bon, il manque pas mal de chose pour investiguer cette question
mais une piste -> Data::Dumper est ton ami.


-- dominix

Avatar
Paul Gaborit
À (at) Thu, 4 Nov 2004 20:19:17 +0100,
"Damien GUERIN" écrivait (wrote):
j'ai un script perl et je cherche le moyen de récupérer les valeurs d'une
variable d'instance d'une librairie Perl dans laquelle il n'y a pas
d'accesseurs pour ces variables.


En général, pour des objets, on parle d'attribut... Si cet attribut n'a pas
d'accesseur, comment savez-vous qu'il existe ?

Je dois donc récupérer la valeur d'une variable sans modifier la librairie.
La librairie est la suivante, je cherche à récupérer la valeur de la
variable "a" sur un objet "$objet" correctement instancié dans mon script
perl.
J'ai essayé :$objet->{a}, $objet->{"a"},... Bref, je sais meme pas si c'est
possible !


Seul la connaissance de l'implémentation d'un objet de cette classe permet de
savoir comment accéder à cet éventuel attribut.

Dans ce cas, Data::Dumper peut aider :

use Data::Dumper;
use LaClasse;

my $objet = LaClasse->new();
print Dumper($objet);

package my_package;
use strict;
use base qw( my_parent_package);
use fields qw(a b c d);
use vars qw[ $VERSION ];
$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /: (d+).(d+)/;
1;

sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my %p = @_;
my $self = $class->SUPER::new(%p);
$self->{a} = $p{a};
$self->{b} = $p{b};
$self->{c} = $p{c};
$self->{d} = $p{d};
return $self;
}


Si la classe récalcitrante s'appelle 'my_package', l'usage de 'fields' utilise
une référence à une table de hachage :

my $obj = my_package->new(a => 123);
print "$obj->{a}n"; # ça marche

Si la classe récalcitrante est 'my_parent_package' alors utilisez Data::Dumper
pour savoir ce que contient $self après l'appel SUPER.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>;
Perl en français - <http://www.enstimac.fr/Perl/>;

Avatar
Damien GUERIN

À (at) Thu, 4 Nov 2004 20:19:17 +0100,
"Damien GUERIN" écrivait (wrote):
j'ai un script perl et je cherche le moyen de récupérer les valeurs d'une
variable d'instance d'une librairie Perl dans laquelle il n'y a pas
d'accesseurs pour ces variables.


En général, pour des objets, on parle d'attribut... Si cet attribut n'a
pas
d'accesseur, comment savez-vous qu'il existe ?


Je sais qu'il exite car j'ai regardé le code de la librairie...


Je dois donc récupérer la valeur d'une variable sans modifier la
librairie.
La librairie est la suivante, je cherche à récupérer la valeur de la
variable "a" sur un objet "$objet" correctement instancié dans mon script
perl.
J'ai essayé :$objet->{a}, $objet->{"a"},... Bref, je sais meme pas si
c'est
possible !


Seul la connaissance de l'implémentation d'un objet de cette classe permet
de
savoir comment accéder à cet éventuel attribut.

Dans ce cas, Data::Dumper peut aider :

use Data::Dumper;
use LaClasse;

my $objet = LaClasse->new();
print Dumper($objet);


Le problème est que l'objet est déjà instancié, je ne peux pas créer une
nouvelle instance car les attributs à passer en paramètre me sont inconnus.
Je peux donc seulement faire Dumper($objet).
Ce que j'ai fait et qui marche c'est la chose suivante :
my $dumper=Dumper($objet);
$dumper =~ /"a" => "(.*)"/;
my $a = $1;
Je sais,'est un peu de la bidoule, mais ça a le mérite de fonctionner !


package my_package;
use strict;
use base qw( my_parent_package);
use fields qw(a b c d);
use vars qw[ $VERSION ];
$VERSION = sprintf "%d.%02d", q$Revision: 1.4 $ =~ /: (d+).(d+)/;
1;

sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
my %p = @_;
my $self = $class->SUPER::new(%p);
$self->{a} = $p{a};
$self->{b} = $p{b};
$self->{c} = $p{c};
$self->{d} = $p{d};
return $self;
}


Si la classe récalcitrante s'appelle 'my_package', l'usage de 'fields'
utilise
une référence à une table de hachage :

my $obj = my_package->new(a => 123);
print "$obj->{a}n"; # ça marche


Le problème est que je ne peux pas faire de new... et si je fais seulement
$obj->{a}, ça ne fonctionne pas !


Si la classe récalcitrante est 'my_parent_package' alors utilisez
Data::Dumper
pour savoir ce que contient $self après l'appel SUPER.


Merci...


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>;
Perl en français - <http://www.enstimac.fr/Perl/>;



Avatar
Paul Gaborit
À (at) Sat, 6 Nov 2004 18:58:51 +0100,
"Damien GUERIN" écrivait (wrote):
Si cet attribut n'a pas d'accesseur, comment savez-vous qu'il existe ?


Je sais qu'il exite car j'ai regardé le code de la librairie...


Si vous avez accès au code, vous devirez pouvoir en déduire comment accèder à
cet attribut.

Seul la connaissance de l'implémentation d'un objet de cette classe permet
de savoir comment accéder à cet éventuel attribut.

Dans ce cas, Data::Dumper peut aider :

use Data::Dumper;
use LaClasse;

my $objet = LaClasse->new();
print Dumper($objet);


Le problème est que l'objet est déjà instancié, je ne peux pas créer une
nouvelle instance car les attributs à passer en paramètre me sont inconnus.
Je peux donc seulement faire Dumper($objet).
Ce que j'ai fait et qui marche c'est la chose suivante :
my $dumper=Dumper($objet);


Affichez $dumper et envoyez-nous le résultat. Nous pourrons alors vous dire
comment récupérer cette valeur sans passer par Dumper.



--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>;
Perl en français - <http://www.enstimac.fr/Perl/>;