Wednesday, November 24, 2010

exercice 8: personnes avec des objets et lecture/écriture fichiers

programme de traitement des personnes:

# exercice 8: programme d'affichage des personnes
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

No comments:

Post a Comment