2010-05-04 2 views
4

J'aime Data::Alias. Il semble être cassé en 5.12. Peut-il être réparé? Sera-t-il réparé bientôt? Y a-t-il une bonne alternative?Comment puis-je obtenir un travail Data :: Alias ​​en Perl 5.12?

+0

Ce problème est courant avec les modules XSub. –

+0

D'après cela, il n'y aura pas de Data :: Alias ​​dans Perl 5.12. https://bugzilla.redhat.com/show_bug.cgi?id=611014 –

+1

Yay! Enfin mis à jour: http://cpansearch.perl.org/src/ZEFRAM/Data-Alias-1.08/Changes –

Répondre

10

Toute version de Data::Alias construite avant la version 1.08 (publiée le 22 octobre 2010 BST) ne fonctionnera pas avec Perl 5.12 car Data::Alias avant que 1.08 soit interrompu dans Perl 5.12. Mettez à niveau vers la dernière version (1.08 ou plus récente) et cela devrait fonctionner! Comme une note intéressante, il semble que l'on puisse faire des alias à Perl en tant que fonctionnalité de langue dans le futur, avec le nettoyage de :=no longer meaning an empty attribute list. Hâte d'y! :)

+1

Je pensais que tout dans le CPAN était automatiquement testé par rapport aux candidats à la version 5.12? Il n'y avait peut-être pas de test unitaire qui couvrait ce cas dans la distribution, auquel cas le signalement du bogue garantira qu'il ne se casse plus jamais. :) – Ether

+0

@Ether: à en juger par le fil sur RT ce n'est pas un bug; le code XS du module a été cassé par un changement aux internes. En ce qui concerne les tests de validation des candidats contre le CPAN, je ne sais pas, mais cela ne semble pas utile à moins que vous ayez fait une comparaison matricielle avec les résultats de la version précédente de perl sur la même plateforme. Beaucoup de modules sur CPAN ont des échecs, cela ne signifie pas que 5.12 les a cassés. :) –

+2

rafl y a jeté un coup d'oeil il y a quelques semaines et a dit que ce ne serait pas trop dur à réparer (c'est "trop ​​dur" pour rafl). Il est censé faire cela pour que Method :: Signatures puisse fonctionner en 5.12. – Schwern

4

Le module n'a pas été mis à jour depuis 2007 mais vous pouvez toujours envoyer un message à l'auteur (Matthijs van Duin: [email protected]) ou déposer un rapport de bug comme Robert l'a mentionné dans sa réponse.

Voici quelques alternatives:

  • En ce qui concerne les modules CPAN supplémentaires pour aliasing qui travaillent dans 5.12+:

    et la recherche de « alias » sur CPAN tourne un peu plus, aucun ne semble fournir le « tout faire avec des alias dans cette déclaration » caractéristique de données :: Alias ​​si . Donc, jusqu'à ce que Data::Alias soit fixé, vous pouvez utiliser l'une des méthodes Perl ci-dessus, ou les suivantes:

  • Perl a pris en charge l'aliasing de toute variable aux variables qui existent dans la table de symboles. Cela se fait comme suit:

    my $x = 1; 
    our $y; # declare $y in the symbol table for the current package 
    { 
        local *y = \$x; # make $y an alias of $x in the current scope 
        $y++; 
    } 
    print $x; # prints 2 
    

    Mais comme toujours, soyez conscient de ce que la portée dynamique/local fait réellement avant de l'utiliser.

  • On peut utiliser un scalaire lexical comme un alias dans le cadre d'une boucle for:

    my $x = 1; 
    for my $y ($x) { 
        $y++; 
    } 
    print $x; # prints 2 
    

    ce type d'alias lexical peut même être passé hors de la boucle dans une fermeture en cas de besoin

  • vous pouvez créer des alias de tableau en utilisant la magie aliasing de Perl pour les listes d'arguments de sous-programme:

    my $x = 1; 
    my $alias = sub{\@_}->($x); # return a reference to its argument list, 
              # which maintains its aliases 
    $$alias[0]++; 
    print $x;  # prints 2 
    

    mais cela ne vous donne pas vraiment m fonctionnalité plus que des références, juste avec une syntaxe différente.

  • Et un exemple en utilisant les références de Perl:

    my $x = 1; 
    my $y = \$x; # take a reference to $x 
    $$y++;  # dereference $y 
    print $x;  # prints 2 
    
+0

Une référence n'est pas la même chose qu'un alias. Les exemples que vous montrez sont un sous-ensemble limité de ce que fait Data :: Alias. –

+0

@brian d foy => l'exemple de référence est là pour montrer une alternative, les deux autres exemples sont le reste des techniques de Perl aliasing que je connais. ce sont bien sûr un sous-ensemble limité sinon Data :: Alias ​​n'aurait probablement pas été écrit. l'OP a demandé des alternatives –

+0

aussi, une référence est exactement la même chose qu'un alias, juste dans des vêtements différents. Pour alias quelque chose, vous placez une référence dans le slot approprié dans un type de variable glob. Quel que soit le sigil que vous utilisez avec l'étiquette de typeglob dit à Perl de le déréférencer, ainsi '$ y' se lit comme" un déréférencement scalaire du typeglob marqué y ". et il y a toujours la syntaxe '* foo {THING}' si vous voulez être bavard à ce sujet, dans ce cas '$ {* y {SCALAR}} ++;' –

0

Je viens de trouver une autre option possible: Scalar::Alias, qui semble fonctionner en Perl 5.12. Évidemment, il ne fait qu'aliaser les scalaires, mais il ne nécessite pas une grosse virgule à la place d'un signe égal.

Questions connexes