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

exercice 6: personnes: noms, ages, adresses avec table de hachage et fonctions

# exercice 6
use strict;
use warnings;

my %pers;

# importer les donnees
while (<>) {
  chomp;
  my ($nom, $age, $adresse) = split ' ', $_, 3;
  $pers{$nom} = {
    nom => $nom,
    age => $age,
    adresse => $adresse,
  };
}

#use Data::Dumper;
#print Dumper \%pers;

my ($nom, $age);
my $etape = 0;

afficher_tout();

$etape++; print "$etape. Un an passe...:\n";
for $nom (sort keys %pers) {
  $pers{$nom}->{age}++;
}

afficher_tout();

$etape++; print "$etape. Tout le monde trie par age:\n";
for $nom (sort { $pers{$a}->{age} <=> $pers{$b}->{age} } keys %pers) {
  affiche($pers{$nom});
}
$etape++; print "$etape. Tout le monde trie par adresse:\n";
for $nom (sort { $pers{$a}->{adresse} cmp $pers{$b}->{adresse} } keys %pers) {
  affiche($pers{$nom});
}

sub afficher_tout {
  $etape++; print "$etape. Les ages de tout le monde:\n";
  for $nom (sort keys %pers) {
    affiche($pers{$nom});
  }
  $etape++; print "$etape. Travailleurs:\n";
  for $nom (sort keys %pers) {
    $age = $pers{$nom}->{age};
    if ($age >= 18 && $age < 65) {
      affiche($pers{$nom});
    }
  }
}

sub affiche {
  my $pers = shift;
  printf "  %-10s %4d %s\n", $pers->{nom}, $pers->{age}, $pers->{adresse},
}

exercice 7: recherche d'infos sur Wikipedia

# exercice 7
use strict;
use warnings;

use LWP::Simple;

my $url_site = 'http://wapedia.mobi/fr/';

my $titre = shift;

if (!defined $titre) {
  die <<END
usage: perl $0 titre_wikipedia

  Affiche des infos sur un sujet donné
  trouvées sur le site:
  $url_site

Exemples:
  perl $0 Renault
  perl $0 "Nicolas Sarkozy"
END
}

my $url = $url_site . $titre;

my $content = get $url;

die <<END unless $content;
adresse inconnue: $url
END

$content =~ m{<p.*?>(.+?)</p>}msig; # premier paragraphe
my $para = $1;
if ($para) {
  while ($content =~ m{<p.*?>(.+?)</p>}msig) {
    $para .= $1;
  }
}

if ($para) {
  # nettoyage
  $para =~ s/<.*?>//gms; # on enleve les balises HTML
  $para =~ s/\n/ /gms; # on met tout sur une ligne
  $para =~ s/&#39;/'/gms; # on remplace les quotes bizarres

  print <<END;
Trouvé les infos suivantes sur "$titre":

$para

Source: $url
END
} else {
  die <<END;
pas trouvé d'infos sur: "$titre"
ici: $url
END
}

Tuesday, November 23, 2010

quelques unilignes sur dict/words

perl -n -e 'print if /aba/' /usr/share/dict/words | head

perl -n -e 'print if /(ba){2}/' /usr/share/dict/words

perl -n -e 'print if /[aeiou]{4}/' /usr/share/dict/words | wc -l

perl -p -e 's/a/A/g' /usr/share/dict/words | less

perl -ne 'print if /^.{30,50}$/' /usr/share/dict/words

perl -MData::Dumper -ne '$stats{length($_)}++; END {$Data::Dumper::Sortkeys = 1; print Dumper \%stats}' /usr/share/dict/words 

modules Perl utiles

Data::Dumper pour afficher des structures de données complexes

LWP::Simple (doc en français) pour lire des pages web

exercice 5: noms et ages avec table de hachage

# exercice 5
use strict;
use warnings;

my %pers;

# importer les donnees
while (<>) {
  chomp;
  my ($nom, $age, $adresse) = split ' ', $_, 3;
  $pers{$nom} = $age;
}

my ($nom, $age);
my $etape = 0;

$etape++; print "$etape. Les ages de tout le monde:\n";
for $nom (sort keys %pers) {
  print "  $nom : $pers{$nom}\n";
}

$etape++; print "$etape. Travailleurs:\n";
for $nom (sort keys %pers) {
  $age = $pers{$nom};
  if ($age >= 18 && $age < 65) {
    print "  $nom : $pers{$nom}\n";
  }
}

$etape++; print "$etape. Un an passe...:\n";
for $nom (sort keys %pers) {
  $pers{$nom}++;
}

$etape++; print "$etape. Les ages de tout le monde:\n";
for $nom (sort keys %pers) {
  print "  $nom : $pers{$nom}\n";
}

$etape++; print "$etape. Travailleurs:\n";
for $nom (sort keys %pers) {
  $age = $pers{$nom};
  if ($age >= 18 && $age < 65) {
    print "  $nom : $pers{$nom}\n";
  }
}

$etape++; print "$etape. Les ages de tout le monde trie par age:\n";
for $nom (sort { $pers{$a} <=> $pers{$b} } keys %pers) {
  print "  $nom : $pers{$nom}\n";
}

$etape++; print "$etape. Environnement:\n";
for my $var (sort keys %ENV) {
  #print "  $var : $ENV{$var}\n";
  printf "  %-20s %-30.30s\n", $var, $ENV{$var};
}

Monday, November 22, 2010

exercice 3: noms et ages a partir d'un fichier

# exercice 3
use strict;
use warnings;

my @noms;
my @ages;

# importer les donnees
while (<>) {
  chomp;
  my ($nom, $age) = split ' ';
  push @noms, $nom;
  push @ages, $age;
}

# afficher les donnees
my ($i, $age, $etape) = (0, 0, 0);

$etape++; print "$etape. Les ages de tout le monde:\n";
for ($i = 0; $i < @noms; $i++) {
  print "$noms[$i] : $ages[$i]\n";
}

$etape++; print "$etape. Travailleurs:\n";
for ($i = 0; $i < @noms; $i++) {
  $age = $ages[$i];
  if ($age >= 18 && $age < 65) {
    print "$noms[$i] : $ages[$i]\n";
  }
}

$etape++; print "$etape. Un an passe...:\n";
for ($i = 0; $i < @ages; $i++) {
  $ages[$i]++;
}

$etape++; print "$etape. Les ages de tout le monde:\n";
for ($i = 0; $i < @noms; $i++) {
  print "$noms[$i] : $ages[$i]\n";
}

$etape++; print "$etape. Travailleurs:\n";
for ($i = 0; $i < @noms; $i++) {
  $age = $ages[$i];
  if ($age >= 18 && $age < 65) {
    print "$noms[$i] : $ages[$i]\n";
  }
}

$etape++; print "$etape. Verification:\n";

if (@noms != @ages) {
  print "attention: nombre de noms = ", scalar @noms, " different de nombre ages = ", scalar @ages, "\n";
}