Scripts Perl

Dernière mise à jour : 26/05/2016

Formulaire web

Énoncé

Créez un formulaire HTML qui permet de saisir un nom, un prénom et un e-mail. Le script contrôlera la validité des données comme suit.

Le nom et le prénom devront être non null. L'e-mail devra contenir un et un seul caractère '@'. Il devra y avoir un et un seul point derrière le caractère '@'. Les chaînes de caractères se trouvant devant '@', entre '@' et le point, et derrière le point devront être non null.

S'il y a une erreur, le formulaire serra réaffiché. Les champs dont les valeurs sont valides seront remplis avec celles-ci et les intitulés des champs erronés seront écrits en rouge.

Si tous les champs sont valides, il faudra afficher le message suivant : "Bonjour <prénom> <nom>, je vous envoi un e-mail à l'adresse <e-mail>".

Solution

#!/usr/bin/perl

################################################################################
# (c) Sebastien ADAM - Decembre 1999 ###########################################
# Licence Creative Commons Attribution - Pas d'Utilisation Commerciale -       #
# Partage dans les Mêmes Conditions 2.0 Belgique.                              #
################################################################################

################################################################################
# Programme principal ##########################################################
################################################################################
&initcolor;
print "content-type: text/html\n\n";
if(!&ReadIn) {
  &form;
} else {
  $ok = 1;
  &testnom;
  &testprenom;
  &testemail;
  if($ok) {
    &reponse;
  } else {
    &form;
  }
}
################################################################################
# Fin programme principal ######################################################
################################################################################

################################################################################
# Fonctions ####################################################################
################################################################################

# Test validite e-mail #########################################################
sub testemail {
  if($in{'email'}) {
    @tmp = split(/@/, $in{'email'});
    if($#tmp != 1) {
      &nomail;
    } else {
      if($tmp[0] && $tmp[1]) {
        @tmp = split(/\./, $tmp[1]);
        if($#tmp != 1) {
          &nomail;
        } else {
          if(!($tmp[0] && $tmp[1])) {
            &nomail;
          }
        }
      } else {
        &nomail;
      }
    }
  } else {
    &nomail;
  }
}

sub nomail {
  $txtcol{'email'} = $couleur{'rouge'};
  $ok = 0;
  $in{'email'} = "";
}
# Fin test validite e-mail #####################################################

# Test validite prenom #########################################################
sub testprenom {
  if(!$in{'prenom'}) {
    $txtcol{'prenom'} = $couleur{'rouge'};
    $ok = 0;
  }
}
# Fin test validite prenom #####################################################

# Test validite nom ############################################################
sub testnom {
  if(!$in{'nom'}) {
    $txtcol{'nom'} = $couleur{'rouge'};
    $ok = 0;
  }
}
# Fin test validite nom ########################################################

# Formulaire de depart #########################################################
sub form {
  print <<  FINPRINT
  <html>

  <head>
  <title>Test script CGI</title>
  <head>
  <body bgcolor="$couleur{'blanc'}">
  <h1 align="center">Formulaire d'enregistrement :</h1>

  <form method="post" action="http://localhost/cgi-bin/mail.pl">
  <table border="0">
  <tr>
  <td><font color="$txtcol{'nom'}">Nom</font></td><td>: <input type="text" name="nom" value="$in{'nom'}"></td>

  </tr><tr>
  <td><font color="$txtcol{'prenom'}">Prénom</font></td><td>: <input type="text" name="prenom" value="$in{'prenom'}"></td>
  </tr><tr>

  <td><font color="$txtcol{'email'}">E-mail</font></td><td>: <input type="text" name="email" value="$in{'email'}"></td>
  </tr>
  </table>

  <center><input type="submit" value="Envoyer">&nbsp;&nbsp;&nbsp;<input type="reset"></center></form>
  </body>
  </html>
  FINPRINT
}
# Fin formulaire de depart #####################################################

# Reponse ######################################################################
sub reponse {
  print <<"  FINPRINT2";
  <html>

  <head>
  <title>test script cgi</title>
  <head>
  <body bgcolor="$couleur{'blanc'}">
  <p align="justify">
    <font face="Courier New">&nbsp;&nbsp;&nbsp;</font>Bonjour $in{'prenom'} $in{'nom'}, je vous envoie un e-mail à l'adresse $in{'email'}.
  </p>

  </body>
  </html>
  FINPRINT2
}
# Fin reponse ##################################################################

# Lecture donnees entree #######################################################
sub ReadIn {
  local(*in) = @_ if @_;
  local($i, $key, $val);
  read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
  @in = split(/&/,$in);
  foreach $i (0 .. $#in) {
    $in[$i] =~ s/\+/ /g;
    ($key, $val) = split(/=/, $in[$i],2);
    $key =~ s/%(..)/pack("c",hex($1))/ge;
    $val =~ s/%(..)/pack("c",hex($1))/ge;
    $in{$key} .= "" if(defined($in{$key}));
    $in{$key} .= $val;
  }
  return length($in);
}
# Fin lecture donnees entree ###################################################

# Initialisation des couleurs ##################################################
sub initcolor {
  $couleur{'noir'}  = "#000000";
  $couleur{'bleu'}  = "#0000FF";
  $couleur{'vert'}  = "#00FF00";
  $couleur{'cyan'}  = "#00FFFF";
  $couleur{'rouge'} = "#FF0000";
  $couleur{'mauve'} = "#FF00FF";
  $couleur{'jaune'} = "#FFFF00";
  $couleur{'blanc'} = "#FFFFFF";
  $txtcol{'nom'}    = $couleur{'noir'};
  $txtcol{'prenom'} = $couleur{'noir'};
  $txtcol{'email'}  = $couleur{'noir'};
}
# Fin initialisation des couleurs ##############################################

################################################################################
# Fin des fonctions ############################################################
################################################################################