2017-07-13 34 views
1

Je vois use experimental 'postderef' étant utilisé dans Moxie ici on line 8. Je suis juste confus à ce qu'il fait. Les pages de manuel pour experimental sont assez trop vagues,Qu'est-ce que la fonction expérimentale perl, postderef?

permettent l'utilisation d'expressions déréférencement Postfix, y compris dans interpoler chaînes

Quelqu'un peut-il montrer ce que vous avez à faire sans pragma, et ce que le pragma rend plus facile ou possible?

Répondre

1

Qu'est-ce que c'est

C'est simple. C'est du sucre syntaxique avec des hauts et des bas. Le pragma n'est plus nécessaire car la fonction est essentielle dans 5.24. Mais pour que la fonctionnalité soit prise en charge entre 5.20 et 5.24, elle doit être activée avec: use experimental 'postderef'. Dans l'exemple fourni, dans Moxie, il est utilisé dans one line qui a $meta->mro->@*; sans cela, vous devrez écrire @{$meta->mro}.

Synopsis

Ce sont droites du blog de D Foy, ainsi que idiomatiques Perl pour la comparaison que j'ai écrit.

D Foy example     Idiomatic Perl 
$gimme_a_ref->()->@[0]->%*  %{ $gimme_a_ref->()[0] } 
$array_ref->@*     @{ $array_ref } 
get_hashref()->@{ qw(cat dog) } @{ get_hashref() }{ qw(cat dog) } 

Ces exemples totalement fournis par D Foy,

D Foy example     Idiomatic Perl 
$array_ref->[0][0]->@*   @{ $array_ref->[0][0] } 
$sub->&*       &some_sub 

Arguments-pour

  • postderef permet Enchaînement.
  • postderef_qq facilite l'interpolation complexe dans les chaînes scalaires.

Arguments contre-

pas du tout fourni par D Foy

  • Perd l'importance de Sigil. Alors que vous saviez ce que le "type" était en regardant le sceau sur le côté le plus à gauche. Maintenant, vous ne savez pas jusqu'à ce que vous lisiez toute la chaîne. Cela semble miner tout argument pour le sceau, en vous forçant à lire toute la chaîne avant de savoir ce qui est attendu. Peut-être que les jours où l'on prétend que les sigils sont une bonne décision de conception sont révolus? Mais, encore une fois, perl6 is still all about them. Manque de cohérence ici.
  • Les surcharges -> signifient comme type. Donc maintenant vous avez $type->[0][1]->@* pour signifier dereference comme $ type, et aussi contraindre à type.
  • Les tranches n'ont pas une syntaxe similaire sur les primitives.

    my @foo = qw/foo bar baz quz quuz quuuz/; 
    my $bar = \@foo; 
    
    # Idiomatic perl array-slices with inclusive-range slicing 
    say @$bar[2..4]; # From reference; returns bazquzquuz 
    say @foo[2..4]; # From primitive; returns bazquzquuz 
    
    # Whizbang thing which has exclusive-range slicing 
    say $bar->@[2,4]; # From reference; returns bazquz 
            # Nothing. 
    

Sources