[gull] Faut-il réhabiliter Perl comme langage de scripting système?

Marc SCHAEFER schaefer at alphanet.ch
Fri Mar 9 23:58:09 CET 2018


On Fri, Mar 09, 2018 at 12:47:47PM +0100, Daniel Cordey wrote:
> Oui et cette "imposition" est bien utile. Ce n'est d'ailleurs pas
> une contrainte... mais on voit des tas de programmes où des gens
> utilisent 'global' a tour de bras. Il est illusoire de croire qu'un

En fait, ce qui pose aussi problème, c'est la pollution de l'espace de
nommage.  Mais pas en Perl, du moins pas avec les modules propres de
CPAN. Chaque module a son "namespace".

> qui utilise quand même Lex & Yacc... Avec une table de symbole, on
> peut facilement faire du "scoping", détecter l'usage d'un
> symbole/variable et les instantiations... Bizarre...

Je pense que c'est une des forces (et un des dangers de Perl), de pouvoir
déterminer en fonction du contexte si l'on est en "liste" (tableau) ou en
scalaire.

Perl permet de faire ça:

my $variable = appel_fonction();

ainsi que

my @variable = appel_fonction();

Dans d'autres langages, il faut explicitement dire que l'on retourne un
tableau, de mémoire en PHP c'est le mot-clé list, ou alors passer par des
références ou des structures complexes.

Autre exemple, prendre des bouts de tableaux:

   $tableau[5] représente le 6e élément; @tableau[5..7] un sous-tableau
   de 5 à 7.

D'autres langages ont des fonctions complexes pour faire la même chose,
le $ désigne un résultat scalaire et le @ un résultat liste (tableau).

Autre exemple, en Perl, je peux écrire:

   my @tableau = (@tab1, @tab2, @tab3);

et il est immédiatement évident que l'on veut concaténer le contenu des 3
tableaux. Dans certains langages on obtiendra un tableau 2D, ou une
structure complexe avec des références de tableaux.

D'un autre côté, cela peut créer des problèmes, exemple:

# validons que le paramètre de formulaire
# colours est un entier.
my $scalar = $query->param('colours');
if ($scalar =~ /^\d+$/) {
   # BUGS
   #    - si $query->param('colours') est un
   #      paramètre multi-valué, on n'aura
   #      validé que le 1er élément du tableau,
   #      alors qu'on passe le tableau entier
   #      à do_something() 
   do_something($query->param('colours'));
}

NB: j'ai exprès mis une variable scalaire temporaire, mais si on l'enlève
la sémantique est la même: dans le premier cas, quand on applique la regexp
on est en contexte scalaire et dans le deuxième en contexte liste.


More information about the gull mailing list