Re: [SSFR] quel langage ? |
[ Thread Index |
Date Index
| More debianworld.org/shellscript-fr Archives
]
Selon Marc Chantreux <marc.chantreux@xxxxxxxxxxx>:
> Sébastien Aperghis-Tramoni a écrit :
>
> >Parce que pour retourner une chaîne, on écrit :
> >
> > $str = reverse "hello";
> >
> >ce qui est non seulement plus élégant, mais en plus bien plus explicite.
>
> mais faux ? je crois bien que reverse ne fonctionne qu'avec un tableau.
> Il faut donc splitter ta chaine.
>
> % perl -le 'print reverse "BABA"'
> BABA
>
> % perl -le 'print reverse split //,"BABA"'
> ABAB
C'est ton exemple qui est faux. reverse() se comporte différement en
fonction du contexte (scalaire ou liste), le premier pouvant se forcer
à l'aide du mot-clé "scalar" ou d'un "opérateur secret" comme le ver :
$ perl -le 'print scalar reverse "hello"'
olleh
$ perl -le 'print ~~ reverse "hello"'
olleh
La raison en est que print() fournit un contexte de liste. Dans le cas
d'une affectation, par contre, le contexte est déjà scalaire :
$ perl -le '$str = reverse "hello"; print $str'
olleh
De manière amusante, si on utilise reverse() sur une liste en contexte
scalaire, il renverse la liste et chaque élément, et concatène le tout :
$ perl -le 'print scalar reverse qw(123 456)'
654321
Comme l'indique la page de manuel (perldoc -f reverse),
print scalar reverse <>
est un bon moyen d'avoir un tac(1) sur les systèmes ne disposant pas de
cette commande.
--
Sébastien Aperghis-Tramoni
Close the world, txEn eht nepO.