Programmation orientée objet en Perl

Références

Références sur les scalaires

Principe

In [1]:
my $v = 10;
my $refv = \$v;
SCALAR(0x7fce9481cc80)
In [2]:
print "$refv\n";
Out[2]:
SCALAR(0x7fce9481cc80)
1
In [3]:
print "$$refv\n";
Out[3]:
10
1
In [4]:
$$refv = 56;
print "$$refv\n";
print "$v\n";
Out[4]:
56
56
1

Utilisation

In [9]:
sub f1{
    my ($ref) = @_;
    $$ref = $$ref + 10;
}
my $v = 20;
my $refv = \$v;
f1( $refv );
print "$v\n";
f1 ( \$v );
print "$v\n";
Out[9]:
30
40
1
In [10]:
sub f2{
    my $v = 20;
    return \$v;
}
my $ref = f2();
print "$$ref\n";
Out[10]:
20
1

QCM

In [5]:
sub f{
    my ($x,$y) = @_;
    $$x = 20;
    $z = $y+10;
    return (\$z); 
}
my $v = 10;
my $w = 20;
my $x = f(\$v,$w);
my $y = $$x + $v;
print "$y\n";
Out[5]:
50
1

Explication des différentes réponses possibles pour le MCQ

  • 30 : pas de prise en compte du changement de $v et de $w par la fonction
  • 40 : pas de prise en compte du changement de $v par la fonction
  • 50 : pas de prise en compte du changement de $w dans la fonction
  • 60 : réponse correcte

Références sur les tableaux

Principe

In [21]:
my @tab = ("ab",10);
my $reft = \@tab;
my @tab2 = @$reft;
print "$tab2[1]\n";
print "$$reft[1]\n";
Out[21]:
10
10
1
In [22]:
@$reft = ("bc",11);
print "$tab[0],$tab[1]\n";
Out[22]:
bc,11
1
In [23]:
$reft->[1] = 12;
print "$tab[1]\n";
Out[23]:
12
1

Tableaux de tableaux

In [25]:
my @t1 = ("tutu", 10);
my @t2 = (20, 30);
my @t = (2, \@t2, \@t1, ("et",20));
foreach my $e (@t) { print "$e\n"; }
Out[25]:
2
ARRAY(0x7fcf70006318)
ARRAY(0x7fcf7000cc98)
et
20

Passage de référence d'un tableau à une fonction

In [ ]:
sub f{
    my ($reftab) = @_;
    $reftab->[2] = 40;
}
my @tab = ( "hello", 10, -2 );
my $ref = \@tab;
f( $ref );
print "$tab\n";

QCM

In [6]:
my $v = 10;
my @t1 = (1,2, \$v);
my @t2 = (20, \@t1);
20ARRAY(0x7fce9481cd88)

Explications des différentes réponses possibles du QCM:

  • $@$t2[1][2] : oubli des {} pour déférencer des groupes de références
  • ${$t2[1]->[2]} : réponse correcte
  • ${@{$t2[1]}[2]} : réponse correcte
  • $t2[1][2] : oubli de déréférencer pour accéder à $v
In [38]:
print "${$t2[1]->[2]}\n";
Out[38]:
10
1
In [40]:
print "${@{$t2[1]}[2]}\n";
Out[40]:
10
1
In [7]:
print "$@$t2[1][2]\n";
Out[7]:
SCALAR(0x7fce9481cc80)
1

Références sur les tableaux associatifs

Principe

In [3]:
my %hash = ('Jean' => 10, 'Jacques' => 70);
my $refh = \%hash;
HASH(0x7ff61400b080)
In [4]:
my %hash2 = %$refh;
print "$hash2{'Jean'}\n";
Out[4]:
10
1
In [5]:
print "$$refh{'Jacques'}\n";
print "$refh->{'Jacques'}\n";
Out[5]:
70
70
1

QCM

In [1]:
my $v = 10;
my %hash1 = ('tata' => \$v, 'titi' => $v, 'toto' => $v);
my %hash2 = ('toto' => 3, 'tutu' => \%hash1);
my $refh = \%hash2;
my $x = $refh->{'tutu'}->{'tata'}+1;
print "$x\n";
Out[1]:
140497054187273
1

Explications des différentes réponses possibles du QCM:

  • SCALAR(0x7ff615809458) : pas de prise en compte du changement de statut de la référence quand ajout de 1
  • 11 : pas de prise en compte de la référence sur $v
  • 140694899430489 : réponse correcte
  • Erreur : pas de compréhension des déréférencement

Modules

Utilisation d'un module

In [4]:
use File::Copy;
In [8]:
copy("files/file1.txt","files/file2.txt") or die "Copy failed: $!";
1
In [9]:
copy("files/file1.txt",\*STDOUT);
Out[9]:
test
test2
1
In [10]:
move("files/file2.txt","files/file3.txt");
1

QCM

In [11]:
use UnModule;
In [15]:
print "@{$UnModule::reft}[0]\n";
Out[15]:
13
1
In [16]:
print "@UnModule::t[0]\n";
Out[16]:

1
In [17]:
print "@UnModule::reft[0]\n";
Out[17]:

1

Explication des différentes réponses du QCM

  • @{$UnModule::reft}[0] : réponse correcte
  • Impossible : pas de prise en compte du fait que reft est accessible
  • @UnModule::t[0] : t inaccessible depuis l'extérieur directement
  • @UnModule::reft[0]: besoin de deréférencer reft

POO

Manipulation

In [28]:
use Employe;
my $e1 = Employe->new("Jean Dupont", 2000);
print "$e1\n";
Out[28]:
Employe=HASH(0x7fc805019840)
1
In [29]:
use Data::Dumper;
print Dumper($e1)."\n";
Out[29]:
$VAR1 = bless( {
                 'SALAIRE' => 2000,
                 'NOM' => 'Jean Dupont'
               }, 'Employe' );

1
In [30]:
my $e1_bis = $e1;
print "$e1_bis\n"
Out[30]:
Employe=HASH(0x7fc805019840)
1

Méthodes

In [1]:
use Employe;
my $e1 = Employe->new("Jean Dupont", 2000);
print $e1->recuperation_info(2),"\n";
Out[1]:
Jean Dupont 2000
1
In [2]:
$e1->augmentation_salaire(2);
2040
In [3]:
print $e1->recuperation_info(2),"\n";
Out[3]:
Jean Dupont 2040
1

QCM

Explication des différentes réponses du QCM:

-

-

In [ ]: