2017-07-13 3 views
1

Ich sehe use experimental 'postderef' wird in Moxie hier on line 8 verwendet. Ich bin nur verwirrt, was es tut. Die Man-Pages für experimental sind zu recht vage,Was ist perl experimentelle Funktion, postderef?

erlauben die Verwendung von Postfix Ausdrücke dereferencing, einschließlich in Interpolations-Strings

Kann mir jemand zeigen, was Sie ohne die Pragma zu tun haben würde, und was die Pragma erleichtert oder möglich?

Antwort

1

Was ist das?

Es ist einfach. Es ist syntaktischer Zucker mit Höhen und Tiefen. Das Pragma wird nicht mehr benötigt, da das Feature in 5.24 Kern ist. Damit das Feature zwischen 5.20 und 5.24 unterstützt wird, muss es jedoch aktiviert werden mit: use experimental 'postderef'. In dem bereitgestellten Beispiel in Moxie wird es in one line verwendet, das $meta->mro->@* hat; Ohne sie müssten Sie @{$meta->mro} schreiben.

Synopsis

Diese sind gerade von D Foy Blog, zusammen mit Idiomatic Perl für den Vergleich, dass ich geschrieben habe.

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) } 

Diese Beispiele vollständig von D Foy bereitgestellt,

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

Arguments for

  • postderef ermöglicht Verkettungs.
  • postderef_qq macht komplexe Interpolation in skalaren Zeichenfolgen einfacher.

Argumente-gegen

an von D Foy nicht alle bereitgestellt

  • Verliert Sigill Bedeutung. Während Sie vorher wussten, was der "Typ" war, indem Sie auf das Siegel auf der linken Seite schauten. Jetzt weißt du es nicht, bis du die ganze Kette gelesen hast. Dies scheint jedes Argument für das Siegel zu unterminieren, indem es gezwungen wird, die gesamte Kette zu lesen, bevor Sie wissen, was erwartet wird. Vielleicht sind die Tage des Arguments, dass Sigillen eine gute Designentscheidung sind, vorbei? Aber dann wieder perl6 is still all about them. Mangel an Konsistenz hier.
  • Overloads -> zu bedeuten, als Typ. So jetzt haben Sie $type->[0][1]->@* zu dereference als $ Typ, und auch zwingen, zu schreiben.
  • Slices haben keine ähnliche Syntax für Primitive.

    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. 
    

Quellen

Verwandte Themen