OVH Cloud OVH Cloud

Syntaxe

4 réponses
Avatar
Jean-Michel Caricand
Bonjour à tous,

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);

print $s->get_name, "\n";
$s->set_rank("e");
print $s->get_rank, "\n";

Mon problème concerne les ligne suivantes :

@data{@attrs} = @args{@attrs};

- D'où vient la variable @data ?
- Que veut dire cette ligne bizarre ?

Merci.

4 réponses

Avatar
Jacques Caron
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.
--
Oxado http://www.oxado.com/

Avatar
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/>

Avatar
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.


Avatar
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.