#!/usr/bin/env perl -w

# exo_perl.pl : programme pour s'exercer aux commandes PERL
# Auteur : Benjamin LISAN

#use warn; # module ne fonctionnant pas pour l instant (doit assurer le debugging).

use strict ; # module qui fonctionne (rend le programme PERL plus fiable).

my $nom = "LISAN";
my @array = (0,1,2,3,4,5);
my $zippy = "ZIPPY";
my $bananes = "banane";
my %hash = ("pomme","rouge","orange","orange");


# ceic est un commentaire
print "Salut, la terre\n";
$nom = "toto";
print "Bonjour, $nom \n"; # Affiche : Bonjour, toto
print 'Bonjour, $nom \n'; # Affiche littéralement : Bonjour, $name\n

# La phrase suivante passe à la ligne en plein milieu du texte
print "Salut
la terre\n";

print("Salut, la terre\n");
print "Salut, la terre\n";

my $animal = "chameau";
print $animal;
print "\nL'animal est un $animal\n";
my $nombre = 42;
print "Le carré de $nombre est " . $nombre*$nombre . "\n";

my @animaux = ("chameau", "lama", "hibou");
my @nombres = (23, 42, 69);
my @melange = ("chameau", 42, 1.23);

print $animaux[0]; # Affiche "chameau"
print "\n";
print $animaux[1]; # Affiche "lama"
print "\n";

print $melange[$#melange]; # dernier élément, affiche 1.23
print "\n";

if (@animaux < 5) {
   print "Nombre d'animaux < a 5 \n";
   }
else
  {  print "Nombre d'animaux >= a 5 \n";
  }

@animaux[0,1]; # donne ("chameau", "lama");
@animaux[0..2]; # donne ("chameau", "lama", "Hibou");
@animaux[1..$#animaux]; # donne tous les éléments sauf le premier

my @tri = sort @animaux; # tri
my @sansdessusdessous = reverse @nombres; # inversion

my %fruit_couleur = (
pomme => "rouge",
banane => "jaune",
);

print $fruit_couleur{"pomme"}; # donne "rouge"
print "\n";

my @fruits = keys %fruit_couleur;
my @couleurs = values %fruit_couleur;

my $variables = {
scalaire => {
description => "élément isolé",
prefix => '$',
},
tableau => {
description => "liste ordonnée d.éléments",
prefix => '@',
},
hash => {
description => "paire clé/valeur",
prefix => '%',
},
};
print "Les scalaires commencent par $variables -> {'scalaire'} -> {'prefix'}\n";
print "Les scalaires commencent par $variables->{'scalaire'}->{'prefix'}\n";
print "Les scalaiires commencent par $variables->scalaire->prefix\n";

foreach (@array) {
print "L'élément courant est $_\n";
}

# comme d.habitude
if ($zippy) {
print "Yahou!";
}
unless ($bananes) {
print "Y'a plus de bananes";
print "\n";
}

# la post-condition Perlienne
print "Yahou!" if $zippy;
print "Y'a plus de bananes" unless $bananes;
print "\n";

# Vous n.êtes pas non plus obligé d.utiliser $_ ...
foreach my $cle (keys %hash) {
print "La valeur de $cle est $hash{$cle}\n";
}

my $a = 0;
my $b = "---";

$a += 4; # comme $a = $a + 1
$a -= 1; # comme $a = $a - 1
$b .= "\n"; # comme $b = $b . "\n";
print $a . " " . $b ;
print "===\n";

print "OUVERTURE, TRAITEMENT ET FERMETURE DE FICHIER \n";
#system("cp -p output.txt_sav output.txt");

open(INFILE, "input.txt") or die "Impossible d'ouvrir input.txt en lecture : $!";
open(OUTFILE, ">>output.txt") or die "Impossible d'ouvrir output.txt en écriture : $!";
open(LOGFILE, ">>my.log") or die "Impossible d'ouvrir logfile en ajout : $!";

#my $ligne = <INFILE>;
#my @lignes = <INFILE>;

while (<INFILE>) { # chaque ligne est successivement affectée à $_
print "Je viens de lire la ligne : $_";
}

my $record = "Jacques\n";
my $logmessage = "Dernier avertissement avant arret base \n";

print OUTFILE $record;
print LOGFILE $logmessage;

close INFILE;
close OUTFILE;
close LOGFILE;


print "== INPUT.TXT ==\n";
system("cat input.txt");
print "== OUTPUT.TXT ==\n";
system("cat output.txt");
print "== MY.LOG ===\n";
system("cat my.log");

# la méthode du pauvre pour décomposer une adresse e-mail
my $email = 'benjamin.lisan@free.fr';
if ($email =~ /([^@])+@(.+)/) {
print "Compte : $1\n";
print "Hôte : $2\n";
}

# La boucle suivante lit l.entrée standard
# et affiche toutes les lignes non vides :
while (<>) {
  if ( $_ != "end" )
   {
    #exit 2 if /end/;
    next if /^$/;
    print "ligne non vide : ";
    print;
   }
  else { goto SORTIE ; }
}
# ce type de sortie de boucle, par un goto, n'est pas tres propre mais fonctionne
# (juste pour résoudre le pb de l'absence (?) de commande 'break' de sortie de boucle
SORTIE :

my $num = 4 ;
print "==> : i= " . $num . " i2= " . &square($num) . "\n" ;

sub square {
my $num = shift;
my $result = $num * $num;
return $result;
}
