-- Thomas vO - <http://perso.enstimac.fr/~vanouden/>
Jogo
Sur fr.comp.lang.perl, Thomas vO disait :
> Je cherche à affecter une référence (pointeur) et pas une valeur. > > $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas : $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
-- Nous connaissons assez le capitalisme pour savoir qu'il n'y a pas de séparation entre le contrôle et la propriété. - Wall Street Journal - A New Owner (01/08/07) -
Sur fr.comp.lang.perl, Thomas vO disait :
> Je cherche à affecter une référence (pointeur) et pas une valeur.
>
> $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas :
$nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3);
my $p = $t[1];
print "$$pn";
@t = qw(a b c);
print "$$pn";
Ça affiche :
2
2
Et non :
2
b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau
tableau, et $p pointe toujours sur l'ancien.
--
Nous connaissons assez le capitalisme pour savoir qu'il n'y a pas de
séparation entre le contrôle et la propriété.
- Wall Street Journal - A New Owner (01/08/07) -
> Je cherche à affecter une référence (pointeur) et pas une valeur. > > $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas : $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
-- Nous connaissons assez le capitalisme pour savoir qu'il n'y a pas de séparation entre le contrôle et la propriété. - Wall Street Journal - A New Owner (01/08/07) -
Thomas vO
à (at) Wed, 2 Jul 2008 14:44:12 +0200, Jogo nous disait (told us):
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
-- Thomas vO - <http://perso.enstimac.fr/~vanouden/>
Patrice Karatchentzeff
Jogo a écrit :
Sur fr.comp.lang.perl, Thomas vO disait :
> > Je cherche à affecter une référence (pointeur) et pas une valeur. > > > > $nom= adresse T[4]; comment l'écrire ? > > d'accord... dans ce cas : > $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
oui, je ne vois pas bien comment tu peux t'y prendre autrement... à chaque liste, tu as un pointeur de liste... tu changes de listes, tu change de pointeur... Je ne comprends pas bien ce que tu veux faire...
> > Je cherche à affecter une référence (pointeur) et pas une valeur.
> >
> > $nom= adresse T[4]; comment l'écrire ?
>
> d'accord... dans ce cas :
> $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3);
my $p = $t[1];
print "$$pn";
@t = qw(a b c);
print "$$pn";
Ça affiche :
2
2
Et non :
2
b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau
tableau, et $p pointe toujours sur l'ancien.
oui, je ne vois pas bien comment tu peux t'y prendre autrement... à
chaque liste, tu as un pointeur de liste... tu changes de listes, tu
change de pointeur... Je ne comprends pas bien ce que tu veux faire...
> > Je cherche à affecter une référence (pointeur) et pas une valeur. > > > > $nom= adresse T[4]; comment l'écrire ? > > d'accord... dans ce cas : > $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
oui, je ne vois pas bien comment tu peux t'y prendre autrement... à chaque liste, tu as un pointeur de liste... tu changes de listes, tu change de pointeur... Je ne comprends pas bien ce que tu veux faire...
> Je cherche à affecter une référence (pointeur) et pas une valeur. > > $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas : $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
Avec $p = $t[1]; $p contient une référence vers le "contenu" de l'élément de rang 1 de @t; vous n'avez aucune référence au tableau lui-même.
Il faudrait garder la référence du tableau $p = @t et ensuite afficher l'élément de rang 1 : print $p->[1]; mais je suppose que c'est ce que vous voulez éviter car il serait plus simple d'écrire print $t[1]; !!
Ce que vous pouvez faire c'est un tie entre un scalaire et un élément d'un tableau. Le petit script suivant définit une classe "ArrayElem" qui permet cela. En faisant par exemple : tie $p, "ArrayElem", @t, 1; la variable $p est un alias de $t[1].
Je ne sais pas à quoi ça peut servir mais c'était rigolo à écrire ;-)
#!/usr/bin/perl use strict; use warnings;
package ArrayElem;
sub TIESCALAR { my $class = shift; bless { array => shift, rang => shift }, $class; }
sub FETCH { my $self = shift; return $self->{array}->[ $self->{rang} ]; }
sub STORE { my $self = shift; $self->{array}->[ $self->{rang} ] = shift; }
package main;
my @t = ( 1, 2, 3 );
tie my $p, "ArrayElem", @t, 1; # $p est lié à $t[1]
print "$pn";
@t = qw(a b c); # on change @t
print "$pn";
$p = 'glop'; # on modifie $t[1]
print join ", ", @t;
__END__
-- J-L.M. http://www.bribes.org/perl
Dans l'article <20080702144412.75280d64.jogo@matabio.net>, jogo@matabio.net a
dit...
Sur fr.comp.lang.perl, Thomas vO disait :
> Je cherche à affecter une référence (pointeur) et pas une valeur.
>
> $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas :
$nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3);
my $p = $t[1];
print "$$pn";
@t = qw(a b c);
print "$$pn";
Ça affiche :
2
2
Et non :
2
b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau
tableau, et $p pointe toujours sur l'ancien.
Avec $p = $t[1]; $p contient une référence vers le "contenu" de l'élément de
rang 1 de @t; vous n'avez aucune référence au tableau lui-même.
Il faudrait garder la référence du tableau $p = @t et ensuite afficher
l'élément de rang 1 : print $p->[1]; mais je suppose que c'est ce que vous
voulez éviter car il serait plus simple d'écrire print $t[1]; !!
Ce que vous pouvez faire c'est un tie entre un scalaire et un élément d'un
tableau. Le petit script suivant définit une classe "ArrayElem" qui permet
cela. En faisant par exemple :
tie $p, "ArrayElem", @t, 1;
la variable $p est un alias de $t[1].
Je ne sais pas à quoi ça peut servir mais c'était rigolo à écrire ;-)
#!/usr/bin/perl
use strict;
use warnings;
package ArrayElem;
sub TIESCALAR {
my $class = shift;
bless { array => shift, rang => shift }, $class;
}
sub FETCH {
my $self = shift;
return $self->{array}->[ $self->{rang} ];
}
sub STORE {
my $self = shift;
$self->{array}->[ $self->{rang} ] = shift;
}
package main;
my @t = ( 1, 2, 3 );
tie my $p, "ArrayElem", @t, 1; # $p est lié à $t[1]
> Je cherche à affecter une référence (pointeur) et pas une valeur. > > $nom= adresse T[4]; comment l'écrire ?
d'accord... dans ce cas : $nom = $T[4];
Non, ça ne marche pas. Perl n'est pas du C !
my @t = (1,2,3); my $p = $t[1]; print "$$pn"; @t = qw(a b c); print "$$pn";
Ça affiche : 2 2
Et non : 2 b
Le problème est que lorsqu'on modifie @t, perl crée un nouveau tableau, et $p pointe toujours sur l'ancien.
Avec $p = $t[1]; $p contient une référence vers le "contenu" de l'élément de rang 1 de @t; vous n'avez aucune référence au tableau lui-même.
Il faudrait garder la référence du tableau $p = @t et ensuite afficher l'élément de rang 1 : print $p->[1]; mais je suppose que c'est ce que vous voulez éviter car il serait plus simple d'écrire print $t[1]; !!
Ce que vous pouvez faire c'est un tie entre un scalaire et un élément d'un tableau. Le petit script suivant définit une classe "ArrayElem" qui permet cela. En faisant par exemple : tie $p, "ArrayElem", @t, 1; la variable $p est un alias de $t[1].
Je ne sais pas à quoi ça peut servir mais c'était rigolo à écrire ;-)
#!/usr/bin/perl use strict; use warnings;
package ArrayElem;
sub TIESCALAR { my $class = shift; bless { array => shift, rang => shift }, $class; }
sub FETCH { my $self = shift; return $self->{array}->[ $self->{rang} ]; }
sub STORE { my $self = shift; $self->{array}->[ $self->{rang} ] = shift; }
package main;
my @t = ( 1, 2, 3 );
tie my $p, "ArrayElem", @t, 1; # $p est lié à $t[1]