EVAL |
Evaluer |
|---|---|
Perl |
Syntaxe
| eval expr |
| eval block |
Paramètres
| Nom | Description |
|---|---|
| expr | Ce paramètre permet d'indiquer la chaîne de caractères contenant le code |
| block | Ce paramètre permet d'indiquer un bloc d'instruction |
Description
Cette fonction permet d'interpréter des instructions ou un bloc d'instructions Perl.
Remarques
- Deux formes distinctes : chaîne ou bloc : La fonction eval existe en deux syntaxes : avec une chaîne (eval $string), ou avec un bloc (eval { ... }). La forme avec chaîne permet d'interpréter dynamiquement du code Perl contenu dans une variable, tandis que le bloc est utilisé principalement pour gérer les erreurs d'exécution dans un environnement sécurisé.
- Exécution dynamique de code : eval est l'une des rares fonctions Perl permettant d'exécuter du code généré ou reçu dynamiquement, ce qui la rend extrêmement puissante, mais aussi potentiellement dangereuse. Elle peut être utilisée, par exemple, pour exécuter du code lu depuis un fichier ou une entrée utilisateur, à condition d'en vérifier rigoureusement le contenu.
- Gestion des erreurs via $@ : Lorsqu'un bloc eval { ... } échoue, l'erreur générée est entreposée dans la variable spéciale $@. Cela permet de capturer les erreurs sans faire planter le programme, et d'implémenter des traitements conditionnels ou de secours. En revanche, si le bloc réussit, $@ est vide, ce qui permet une vérification simple.
- Sécurité et injection de code : L'utilisation de eval avec des chaînes (notamment eval $string) pose un risque majeur de sécurité si le contenu n'est pas contrôlé. Une injection de code malveillant peut compromettre l'ensemble du système. C'est pourquoi son usage est déconseillé avec des données provenant de l'extérieur, à moins de mettre en place des filtrages stricts.
- Utilisation pour la compilation conditionnelle : eval peut être utilisé pour tester dynamiquement si un module est disponible, via des instructions du type eval "use Some::Module". Cela évite à un script de planter au démarrage si le module n'est pas installé, et permet de rendre le code plus portable ou modulaire.
- Bloc eval vs try/catch : En Perl natif, eval { ... } est souvent utilisé comme alternative à une structure try/catch, absente dans le langage de base. Cette approche permet d'encapsuler du code sensible dans un bloc isolé, avec récupération d'exception via $@, imitant ainsi le comportement de langages plus modernes.
- Retour de valeur flexible : Un eval retourne la dernière valeur évaluée du bloc ou de la chaîne, ce qui en fait non seulement un outil de contrôle d'erreur mais aussi un mécanisme pour exécuter des expressions calculées à la volée et en récupérer le résultat. Cela est utile pour créer des évaluateurs ou moteurs de règles dynamiques.
- Impact sur les performances : L'usage abusif de eval, en particulier dans des boucles ou sur de grandes quantités de données, peut dégrader les performances d'un script Perl. Chaque appel à eval $string implique une phase d'analyse et de compilation à l'exécution, ce qui est bien plus coûteux qu'un code statique.
Exemple
Voici un exemple d'une utilisation typique de cette fonction :
on obtiendra le résultat suivant :
eval("777") = 777eval("MaFonction()") = Gladir.com
eval("8*8+1") = 65
Voir également
Langage de programmation - Structure de données - Évaluation d'expression («Infix to Postfix»)
Langage de programmation - PHP - Référence de procédures et fonctions - eval
Références
La Bible Micro Application HTML & Développement Web, Stefan Munz, Wolfgang Nefzger, 2003, ISBN: 2-7429-2898-7, page 1135
Perl/CGI-Programmation avancée Grand Livre, Edition Micro Application, Rolf D. Stoll, 2001, ISBN: 2742919082, page 94, 272
Dernière mise à jour : Dimanche, le 18 octobre 2015