Je viens de lire un code que je ne comprends pas. Le voici :
package Soldier;
$VERSION = 1.00;
use strict;
use Carp;
my @attrs = qw(name rank serial_num);
sub new
{
my ($class, %args) = @_;
my %data;
@data{@attrs} = @args{@attrs};
my $accessor =
sub
{
my ($cmd, $attr, $newval) = @_;
return $data{$attr}
if $cmd eq "get";
return $data{"rank"} = $newval
if ($cmd eq "set" && $attr eq "rank");
croak "Cannot $cmd attribute $attr";
};
bless $accessor, ref($class)||$class;
}
# These methods provide the only means of accessing object attributes
# (note that only rank can be changed)
sub get_name { $_[0]->('get','name') }
sub get_rank { $_[0]->('get','rank') }
sub get_serial_num { $_[0]->('get','serial_num') }
sub set_rank
{
my ($self, $newrank) = @_;
$self->('set','rank',$newrank);
}
package main;
my $s = Soldier->new(name=>'a', rank=>'capitaine', serial_num=>2);
On Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand wrote:
my @attrs = qw(name rank serial_num);
[...]
my ($class, %args) = @_; my %data; @data{@attrs} = @args{@attrs};
[...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Il s'agit de %data.
- Que veut dire cette ligne bizarre ?
La même chose que: for (@attrs) { $data{$_} = $args{$_}; }
J'avoue que je ne connaissais pas, mais ça figure effectivement au début de perldoc perldata:
@days{'a','c'} # same as ($days{'a'},$days{'c'})
On en découvre tous les jours en perl :-)
Jacques. -- Oxado http://www.oxado.com/
Paul Gaborit
À (at) Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand écrivait (wrote):
Je viens de lire un code que je ne comprends pas. Le voici : [... le code ...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Cette ligne parle de %data et non de @data !
- Que veut dire cette ligne bizarre ?
La notation @data{@attrs} signifie la liste (d'où le @ initiale) des éléments de la table de hachage %data (d'où le data{...}) dont les clés sont @attrs. Idem pour la suite mais sur la table %args.
On recopie donc d'un seul coup plusieurs valeurs de la table %args dans la table %data.
Pour en savoir plus, lire perldata.
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand
<jean-michel.caricand@lifc.univ-fcomte.fr> écrivait (wrote):
Je viens de lire un code que je ne comprends pas. Le voici :
[... le code ...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Cette ligne parle de %data et non de @data !
- Que veut dire cette ligne bizarre ?
La notation @data{@attrs} signifie la liste (d'où le @ initiale) des
éléments de la table de hachage %data (d'où le data{...}) dont les
clés sont @attrs. Idem pour la suite mais sur la table %args.
On recopie donc d'un seul coup plusieurs valeurs de la table %args
dans la table %data.
Pour en savoir plus, lire perldata.
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand écrivait (wrote):
Je viens de lire un code que je ne comprends pas. Le voici : [... le code ...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Cette ligne parle de %data et non de @data !
- Que veut dire cette ligne bizarre ?
La notation @data{@attrs} signifie la liste (d'où le @ initiale) des éléments de la table de hachage %data (d'où le data{...}) dont les clés sont @attrs. Idem pour la suite mais sur la table %args.
On recopie donc d'un seul coup plusieurs valeurs de la table %args dans la table %data.
Pour en savoir plus, lire perldata.
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
Jean-Michel Caricand
Jacques Caron wrote:
Salut,
On Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand wrote:
my @attrs = qw(name rank serial_num);
[...]
my ($class, %args) = @_; my %data; @data{@attrs} = @args{@attrs};
[...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Il s'agit de %data.
- Que veut dire cette ligne bizarre ?
La même chose que: for (@attrs) { $data{$_} = $args{$_}; }
J'avoue que je ne connaissais pas, mais ça figure effectivement au début de perldoc perldata:
@days{'a','c'} # same as ($days{'a'},$days{'c'})
On en découvre tous les jours en perl :-)
Jacques.
J'étais perdu car il me semblait que %data et @data était vu comme deux variables différentes en Perl. Un print sur @data me retournait une erreur indiquant que @data n'existait pas. Je soupçonnais une subtilité de syntaxe.
Merci à vous deux.
Jacques Caron wrote:
Salut,
On Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand
<jean-michel.caricand@lifc.univ-fcomte.fr> wrote:
my @attrs = qw(name rank serial_num);
[...]
my ($class, %args) = @_;
my %data;
@data{@attrs} = @args{@attrs};
[...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Il s'agit de %data.
- Que veut dire cette ligne bizarre ?
La même chose que:
for (@attrs)
{
$data{$_} = $args{$_};
}
J'avoue que je ne connaissais pas, mais ça figure effectivement au début
de perldoc perldata:
@days{'a','c'} # same as ($days{'a'},$days{'c'})
On en découvre tous les jours en perl :-)
Jacques.
J'étais perdu car il me semblait que %data et @data était vu comme deux
variables différentes en Perl. Un print sur @data me retournait une erreur
indiquant que @data n'existait pas. Je soupçonnais une subtilité de
syntaxe.
On Thu, 16 Mar 2006 12:54:18 +0100, Jean-Michel Caricand wrote:
my @attrs = qw(name rank serial_num);
[...]
my ($class, %args) = @_; my %data; @data{@attrs} = @args{@attrs};
[...]
Mon problème concerne les ligne suivantes :
@data{@attrs} = @args{@attrs};
- D'où vient la variable @data ?
Il s'agit de %data.
- Que veut dire cette ligne bizarre ?
La même chose que: for (@attrs) { $data{$_} = $args{$_}; }
J'avoue que je ne connaissais pas, mais ça figure effectivement au début de perldoc perldata:
@days{'a','c'} # same as ($days{'a'},$days{'c'})
On en découvre tous les jours en perl :-)
Jacques.
J'étais perdu car il me semblait que %data et @data était vu comme deux variables différentes en Perl. Un print sur @data me retournait une erreur indiquant que @data n'existait pas. Je soupçonnais une subtilité de syntaxe.
Merci à vous deux.
Nicolas George
Jean-Michel Caricand wrote in message <dvbm9i$g61$:
J'étais perdu car il me semblait que %data et @data était vu comme deux variables différentes en Perl.
Oui, mais ce qui compte, c'est l'utilisation qui est faite de la variable. Quand il y a écrit @data{...}, l'utilisation, c'est les accolades, et donc c'est _forcément_ %data qui est concernée. De même, quand on écrit $data[...], l'utilisation est désignée par les crochets, donc c'est @data malgré le $. Le @ dans @data{...} ou le $ dans $data[...] indique que l'_ensemble_ @data{...} ou $data[...] est une liste ou un scalaire.
Jean-Michel Caricand wrote in message
<dvbm9i$g61$1@ufc222.univ-fcomte.fr>:
J'étais perdu car il me semblait que %data et @data était vu comme deux
variables différentes en Perl.
Oui, mais ce qui compte, c'est l'utilisation qui est faite de la variable.
Quand il y a écrit @data{...}, l'utilisation, c'est les accolades, et donc
c'est _forcément_ %data qui est concernée. De même, quand on écrit
$data[...], l'utilisation est désignée par les crochets, donc c'est @data
malgré le $. Le @ dans @data{...} ou le $ dans $data[...] indique que
l'_ensemble_ @data{...} ou $data[...] est une liste ou un scalaire.
Jean-Michel Caricand wrote in message <dvbm9i$g61$:
J'étais perdu car il me semblait que %data et @data était vu comme deux variables différentes en Perl.
Oui, mais ce qui compte, c'est l'utilisation qui est faite de la variable. Quand il y a écrit @data{...}, l'utilisation, c'est les accolades, et donc c'est _forcément_ %data qui est concernée. De même, quand on écrit $data[...], l'utilisation est désignée par les crochets, donc c'est @data malgré le $. Le @ dans @data{...} ou le $ dans $data[...] indique que l'_ensemble_ @data{...} ou $data[...] est une liste ou un scalaire.