IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Perl 5.38, la dernière mise à jour du langage de programmation, est disponible
Et apporte une nouvelle fonctionnalité expérimentale pour les classes, ainsi que plusieurs améliorations

Le , par Anthony

28PARTAGES

5  0 
Perl 5.38, la dernière mise à jour du langage de programmation, est disponible, et apporte une nouvelle fonctionnalité expérimentale pour les classes, ainsi que plusieurs améliorations

Après plus d'un an de développement depuis Perl 5.36, la version 5.38 de Perl vient d'être publiée et constitue la dernière mise à jour de ce langage de programmation. Cette mouture fournit une nouvelle syntaxe expérimentale pour définir les classes d'objets et prend désormais en charge l'Unicode 15.0. Elle propose également de nouvelles API, une nouvelle variable d'environnement pour la génération des nombres aléatoires, ainsi que divers autres changements.


Améliorations de base

Nouvelle fonctionnalité pour les classes

Une nouvelle syntaxe expérimentale est désormais disponible pour définir des classes d'objets, où les données par instance sont stockées dans des variables " field " qui se comportent comme des lexiques.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
use feature 'class';

class Point
{
    field $x;
    field $y;

    method zero { $x = $y = 0; }
}

Cette syntaxe est décrite plus en détail dans perlclass. Des notes sur les aspects internes de son implémentation et d'autres détails connexes peuvent être trouvés dans perlclassguts.

Il s'agit d'une fonctionnalité nouvelle et expérimentale, qui est encore en cours de développement. Elle fera l'objet d'ajouts, de raffinements et de modifications dans les prochaines versions. Comme il s'agit d'une fonctionnalité expérimentale, elle produit des avertissements dans la catégorie experimental::class. Ces avertissements peuvent être supprimés par une déclaration no warnings.

Code : Sélectionner tout
1
2
use feature 'class';
no warnings 'experimental::class';

Unicode 15.0 est désormais pris en charge

Voir Unicode 15.0.0 pour plus de détails.

Les avertissements de dépréciation ont maintenant des sous-catégories spécifiques

Tous les avertissements de dépréciation ont maintenant leur propre catégorie de dépréciation spécifique qui peut être désactivée individuellement. Vous pouvez voir une liste de toutes les fonctionnalités dépréciées dans perldeprecation, et dans warnings. La liste suivante provient des avertissements :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+- deprecated ----+
|                 |
|                 +- deprecated::apostrophe_as_package_separator
|                 |
|                 +- deprecated::delimiter_will_be_paired
|                 |
|                 +- deprecated::dot_in_inc
|                 |
|                 +- deprecated::goto_construct
|                 |
|                 +- deprecated::smartmatch
|                 |
|                 +- deprecated::unicode_property_name
|                 |
|                 +- deprecated::version_downgrade

Il est toujours possible de désactiver tous les avertissements de dépréciation en une seule déclaration avec la commande

Code : Sélectionner tout
no warnings 'deprecated';

mais il est maintenant possible d'avoir un contrôle plus fin. Comme cela a toujours été le cas, ces avertissements sont automatiquement activés avec la commande

Code : Sélectionner tout
use warnings;

Introduction de l'API %{^HOOK}

Pour diverses raisons, il peut être difficile de créer des wrappers de sous-programmes pour certains mots-clés de Perl. Tout mot-clé dont le prototype n'est pas défini ne peut tout simplement pas être encapsulé dans une sous-routine, et certains mots-clés que perl permet d'encapsuler sont en pratique très difficiles à intégrer. Par exemple, require est délicat à envelopper, c'est possible mais cela modifie la profondeur de la pile, et les méthodes standard d'exportation supposent qu'elles seront exportées vers un paquet à une certaine profondeur de la pile, et l'enveloppe changera donc l'endroit où les fonctions sont exportées à moins d'être implémentée avec beaucoup d'attention. Cela peut être très gênant à gérer.

C'est pourquoi un nouveau hachage appelé %{^HOOK} a été introduit afin de faciliter ce genre de situation. Lorsqu'un mot-clé supporte une sorte de crochet spécial, ce hook sera placé dans ce nouveau hachage. Les crochets de ce hachage seront nommés d'après la fonction par laquelle ils sont appelés, suivie de deux barres inférieures, puis de la phase dans laquelle ils sont exécutés, actuellement avant ou après l'exécution du mot-clé.

Cette version initiale supporte désormais deux types de crochets require__before et require__after. Ils sont fournis pour faciliter l'exécution de tâches avant et après une déclaration require.

PERL_RAND_SEED

Une nouvelle variable d'environnement PERL_RAND_SEED a été ajoutée et peut être utilisée pour faire en sorte qu'un programme perl qui utilise rand sans utiliser explicitement srand() ou qui utilise srand() sans arguments soit répétable. Voir perlrun. Cette fonctionnalité peut être désactivée à la compilation en passant l'option

Code : Sélectionner tout
-Accflags=-DNO_PERL_RAND_SEED

à Configure pendant le processus de compilation.

Expressions par défaut des affectations définies-ou et logique-ou dans les signatures

L'expression par défaut pour un paramètre de signature de sous-routine peut maintenant être assignée en utilisant les opérateurs //= ou ||=, pour appliquer les valeurs par défaut lorsque l'appelant a fourni une valeur indéfinie ou fausse (respectivement), plutôt que simplement lorsque le paramètre est entièrement manquant. Pour plus de détails, voir la documentation de perlsub.

Améliorations des crochets @INC et $INC et INCDIR

La partie interne des crochets @INC a été renforcée pour gérer différents cas de figure et ne devrait plus générer de segfault ou d'assert failures lorsque les crochets modifient @INC au cours d'une opération require. Dans ce cadre, il est maintenant assuré qu'un crochet donné n'est exécuté qu'une seule fois lors d'un appel de requête, et que les répertoires dupliqués ne déclenchent pas de sondes de répertoires supplémentaires.

Pour permettre aux développeurs de mieux contrôler la recherche dynamique de modules, une nouvelle méthode de crochet, INCDIR, est désormais prise en charge. Un objet supportant cette méthode peut être injecté dans le tableau @INC, et lorsqu'il est rencontré dans le processus de recherche de module, il sera exécuté, de la même manière que les crochets INC sont exécutés, et sa valeur de retour sera utilisée comme une liste de répertoires à rechercher pour le module. Le retour d'une liste vide est un no-op. Notez qu'étant donné que toutes les références renvoyées par ce crochet seront transformées en chaînes et utilisées comme chaînes, vous ne pouvez pas renvoyer un crochet qui sera exécuté ultérieurement via cette API.

Lorsqu'un crochet @INC (soit INC ou INCDIR) est appelé pendant require, la variable $INC sera localisée pour être la valeur de l'index de @INC à partir duquel le crochet est venu. Si le crochet souhaite modifier l'index "next" de @INC, il peut mettre à jour $INC pour qu'il soit inférieur d'une unité à l'index désiré (undef équivaut à -1). Cela permet à un hook @INC de réécrire complètement le tableau @INC et de faire en sorte que perl redémarre ses sondages de répertoires à partir du début de @INC.

Les références blessed CODE dans @INC qui ne supportent pas les méthodes INC ou INCDIR ne déclencheront plus d'exception, et à la place seront traitées de la même manière que les références unblessed code, et exécutées comme s'il s'agissait d'un crochet INC.

Le flux de contrôle interdit en dehors de defer ou finally est maintenant détecté à la compilation

Il est interdit d'essayer de quitter un bloc defer ou finally au moyen d'un flux de contrôle tel que return ou goto. Les versions précédentes de perl ne pouvaient détecter cela qu'en cas de tentative à l'exécution.

Cette version de perl ajoute une détection à la compilation pour de nombreux cas qui peuvent être déterminés statiquement. Cela peut signifier que du code qui a été compilé avec succès dans une version précédente de perl est maintenant signalé comme une erreur de compilation dans cette version. Cela ne se produit que dans les cas où l'exécution du code aurait été de toute façon une erreur ; l'erreur se produit simplement à un moment antérieur.

Eval optimiste dans les motifs

L'utilisation de (?{ ... }) et de (??{ ... }) dans un motif désactive diverses optimisations globales dans ce motif. Cela peut être souhaité ou non par le programmeur. Cette version ajoute l'équivalent (*{ ... }). La seule différence est qu'il ne désactive et ne désactivera jamais aucune optimisation dans le moteur de regex. Cela peut le rendre plus instable dans le sens où il peut être appelé plus ou moins de fois dans le futur, cependant le nombre de fois qu'il s'exécute correspondra vraiment à la façon dont le moteur de regex fonctionne. Par exemple, certains types d'optimisation sont désactivés lorsque (?{ ... }) est inclus dans un motif, de sorte que les motifs qui sont en O(N) en utilisation normale deviennent en O(N*N) avec un motif (?{ ... }). Le passage à (*{ ... }) signifie que le motif restera en O(N).

REG_INF est passé de 65 536 à 2 147 483 647

De nombreux quantificateurs de regex étaient limités à U16_MAX dans le passé, mais sont maintenant limités à I32_MAX, de sorte qu'il est maintenant possible d'écrire /(?:word){1000000}/ par exemple. Notez qu'en procédant de la sorte, le moteur de regex peut s'exécuter plus longtemps et utiliser plus de mémoire.

Nouvelles fonctions API optimize_optree et finalize_optree

Il y a deux nouvelles fonctions API pour opérer sur les fragments d'arborescence, assurant que vous pouvez invoquer les parties requises du processus de génération d'arborescence qui pourraient autrement ne pas être invoquées (par exemple, lors de la création d'un LOGOP personnalisé). Pour accéder à ces fonctions, vous devez d'abord définir une #define pour accepter d'utiliser ces fonctions.

Code : Sélectionner tout
#define PERL_USE_VOLATILE_API

Ces fonctions sont étroitement liées au fonctionnement interne de l'interpréteur, et peuvent être modifiées ou supprimées à tout moment si d'autres changements internes le rendent nécessaire.

Certains gotos sont maintenant autorisés dans les blocs defer et finally

La version 5.36.0 de Perl a ajouté les blocs defer et autorisé le mot-clé finally pour ajouter un comportement similaire à la syntaxe try/catch. Ces blocs n'autorisaient aucune expression goto à l'intérieur du corps, car cela aurait pu faire sortir le flux de contrôle du bloc. Désormais, certaines expressions goto sont autorisées si elles ont une étiquette cible constante et que cette étiquette se trouve à l'intérieur du bloc.

Code : Sélectionner tout
1
2
3
4
5
6
7
use feature 'defer';

defer {
  goto LABEL;
  print "This does not execute\n";
  LABEL: print "This does\n";
}

Nouvelle variable regexp ${^LAST_SUCCESSFUL_PATTERN}

Elle permet d'accéder au dernier motif réussi dans la portée courante. De nombreux aspects du moteur de regex font référence au "dernier motif réussi". Le motif vide le réutilise, et toutes les variables magiques de regex s'y rapportent. Cela permet d'accéder à son motif. Le code suivant

Code : Sélectionner tout
1
2
3
if (m/foo/ || m/bar/) {
    s//PQR/;
}

peut être réécrit comme suit

Code : Sélectionner tout
1
2
3
if (m/foo/ || m/bar/) {
    s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
}

et il fera exactement la même chose.

La catégorie LC_NAME est désormais prise en charge sur les plates-formes participantes

Sur les plates-formes qui disposent de la catégorie LC_NAME de l'extension GNU, vous pouvez désormais l'utiliser comme paramètre de catégorie à "setlocale" dans POSIX pour définir et interroger ses paramètres linguistiques.

Lire la suite sur Perl.org

Syntaxe des classes Perl

SYNOPSIS

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use v5.38;
use feature 'class';

class My::Example 1.234 {
    field $x;

    ADJUST {
        $x = "Hello, world";
    }

    method print_message {
        say $x;
    }
}

My::Example->new->print_message;

DESCRIPTION

Ce document décrit la syntaxe de la fonctionnalité class de Perl, qui fournit des mots-clés natifs supportant le paradigme de la programmation orientée objet.

Historique

Depuis Perl 5, la prise en charge des objets s'articule autour du concept de blessing (bénédiction) des références avec un nom de paquetage. Cette référence pouvait alors être utilisée pour appeler des sous-programmes du paquetage avec lequel elle avait été bénite (ou n'importe lequel de ses parents). Ce système, bien que dépouillé, était suffisamment souple pour permettre la création de plusieurs systèmes d'orientation objet plus avancés et gérés par la communauté.

Class feature est une implémentation de base de la syntaxe de classe qui est familière à ce que l'on trouve dans d'autres langages de programmation. Il ne s'agit pas d'un wrapper bless, mais d'un système complètement nouveau intégré à l'interpréteur Perl.

MOTS-CLÉS

L'activation de la fonctionnalité class permet l'utilisation des nouveaux mots-clés suivants dans le cadre du paquetage actuel :

class

Code : Sélectionner tout
1
2
3
4
5
6
7
class NAME BLOCK

class NAME VERSION BLOCK

class NAME;

class NAME VERSION;

Le mot-clé class déclare un nouveau paquetage destiné à être une classe. Tous les autres mots-clés de la fonctionnalité class doivent être utilisés dans le cadre de cette déclaration.

Code : Sélectionner tout
1
2
3
class WithVersion 1.000 {
    # class definition goes here
}

Les classes peuvent être déclarées dans la syntaxe du bloc ou de la déclaration. Si un bloc est utilisé, le corps du bloc contient l'implémentation de la classe. Dans le cas d'une déclaration, le reste du fichier est utilisé jusqu'à la prochaine déclaration class ou package.

Les déclarations class et package sont similaires, mais les classes ont automatiquement un constructeur nommé new - vous n'avez pas à (et ne devriez pas) en écrire un. En outre, dans la classe BLOCK, vous êtes autorisé à déclarer des champs et des méthodes.

field

Code : Sélectionner tout
1
2
3
4
5
6
7
field VARIABLE_NAME;

field VARIABLE_NAME = EXPR;

field VARIABLE_NAME : ATTRIBUTES;

field VARIABLE_NAME : ATTRIBUTES = EXPR;

Les champs sont des variables visibles dans le cadre de la classe - plus précisément dans les blocs "method" et ADJUST. Chaque instance de classe dispose de son propre stockage de champs, indépendamment les uns des autres.

Un champ se comporte comme une variable lexicale normale. Il possède un sigil et est privé pour la classe (bien que la création d'une méthode d'accès le rende accessible de l'extérieur). La principale différence est que des instances différentes accèdent à des valeurs différentes dans la même portée.

Code : Sélectionner tout
1
2
3
4
5
class WithFields {
    field $scalar = 42;
    field @array  = qw(this is just an array);
    field %hash   = (species => 'Martian', planet => 'Mars');
}

Les champs peuvent optionnellement...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !