use strict;
use warnings;
use Personne;
my $infile = shift;
my $outfile = shift;
if (!defined $outfile) {
die <<END
usage: perl $0 infile outfile
Lit des infos sur des personnes du fichier infile.
Affiche tout, fait passer un an, affiche tout.
Stocke les infos dans le fichier outfile.
Exemple:
perl $0 pers.txt pers2.txt
END
}
my %pers;
# importer les donnees
open my $fin, '<', $infile or die "$infile: $!\n";
while (<$fin>) {
chomp;
my ($nom, $age, $adresse) = split ' ', $_, 3;
$pers{$nom} = Personne->new($nom, $age, $adresse);
}
close $fin;
# pour exporter les donnees
open my $fout, '>', $outfile or die "$outfile: $!\n";
#use Data::Dumper;
#print Dumper \%pers;
my ($nom, $age);
my $etape = 0;
afficher_tout();
$etape++; warn "$etape. Un an passe...:\n";
for $nom (sort keys %pers) {
$pers{$nom}->vieillir();
}
afficher_tout();
$etape++; warn "$etape. Tout le monde trie par age:\n";
for $nom (sort { $pers{$a}->get_age() <=> $pers{$b}->get_age() } keys %pers) {
print $fout $pers{$nom}->affiche();
}
$etape++; warn "$etape. Tout le monde trie par adresse:\n";
for $nom (sort { $pers{$a}->get_adresse() cmp $pers{$b}->get_adresse() } keys %pers) {
print $fout $pers{$nom}->affiche();
}
close $fout;
sub afficher_tout {
$etape++; warn "$etape. Les ages de tout le monde:\n";
for $nom (sort keys %pers) {
print $fout $pers{$nom}->affiche();
}
$etape++; warn "$etape. Travailleurs:\n";
for $nom (sort keys %pers) {
$age = $pers{$nom}->get_age();
if ($age >= 18 && $age < 65) {
print $fout $pers{$nom}->affiche();
}
}
}
classe Personne:
# exercice 8: classe Personne
use strict;
use warnings;
package Personne;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{_nom} = shift;
$self->{_age} = shift;
$self->{_adresse} = shift;
bless($self, $class);
return $self;
}
sub affiche {
my $pers = shift;
sprintf " %-10s %4d %s\n", $pers->{_nom}, $pers->{_age}, $pers->{_adresse};
}
sub get_age {
my $self = shift;
return $self->{_age};
}
sub get_adresse {
my $self = shift;
return $self->{_adresse};
}
sub vieillir {
my $self = shift;
$self->{_age}++; # vieillir de 1 an
}
1;
__END__
=head1 NAME
Personne - la classe des personnes
=head1 SYNOPSIS
use Personne;
# créer une personne
my $p = Personne->new($nom, $age, $adresse);
# la faire vieillir
$p->vieillir()
=head1 DESCRIPTION
Une classe pour le cours de Perl.
Un objet Personne avec un peu d'encapsulation.
=head2 Méthodes
=over 4
=item I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>)
Crée une personne.
=item I<$OBJ>->vieillir
Faire vieillir la personne d'un an.
=back
=head1 AUTEUR
Kai Carver kai@boxtale.com
Copyleft (c) 2010 Kai Carver. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=head1 VERSION
Version 1 (Nov 24 2010)
=head1 VOIR AUSSI
perl(1)
=cut