Onverwacht gedrag bij het gebruik van Tie :: File on __DATA__

In een poging een oude vraag op een slimme manier te beantwoorden, ging ik dit proberen, niet wetend of het zou lukken:

#!/usr/bin/env perl

use strict;
use warnings;

use Tie::File;
tie( my @data, 'Tie::File', \*DATA ) or die "Cannot tie DATA";

foreach ( @data ) {
    print;
}

foreach ( @data ) {
    print scalar reverse;
}


__DATA__
one
two
three
four
five
six

Ik verwachtte dat het zou werken of sterven; wat ik kreeg was onverwacht:

#!/usr/bin/env perluse strict;use warnings;use Tie::File;tie( my @data, 'Tie::File', \*DATA ) or die "Cannot tie DATA";foreach ( @data ) {    print;}foreach ( @data ) {    print scalar reverse;}__DATA__onetwothreefourfivesixlrep vne/nib/rsu/!#;tcirts esu;sgninraw esu;eliF::eiT esu;"ATAD eit tonnaC" eid ro ) ATAD*\ ,'eliF::eiT' ,[email protected] ym (eit{ ) [email protected] ( hcaerof;tnirp    }{ ) [email protected] ( hcaerof;esrever ralacs tnirp    }__ATAD__enoowteerhtruofevifxis

Hoe is het in hemelsnaam geprobeerd om __ DATA __ in Tie :: File te binden, heeft dit het script gebonden, en chomp ook ?!

3

1 antwoord

De DATA filehandle is slechts een open filehandle voor het bestand dat ernaar verwijst. Het heeft wat extra magie dat het de eerste keer dat het gelezen wordt naar de eerste byte na de __ DATA __ of __ END __ token in je programma zoekt, waardoor je het gedrag krijgt dat je verwacht .

Wanneer u * DATA verbindt, staat u de eerste gelezen magie in de weg en krijgt u een greep naar uw bronbestand bovenaan het bestand.

Ik vermoed dat als je eerst DATA oproept (of misschien DATA, 0,1 zoekt) voordat je tie , het in de juiste positie en "werk" zoals je verwachtte.

4
toegevoegd
Spot op. Ook met betrekking tot de chomp , wordt Tie :: File automatisch gevolgd, tenzij je zegt dat het niet moet.
toegevoegd de auteur Eric Strom, de bron
@Joel Berger - je hebt gelijk. Er is een seek $ file, 0,0 -oproep vroeg in Tie :: File . Misschien is dat een foutenrapport waard? :-)
toegevoegd de auteur mob, de bron
Het onverslaanbare tag-team haalt het snel. Dit was een beste een curiositeit en in het slechtste geval een bug. Bedankt.
toegevoegd de auteur Joel Berger, de bron
De tell en seek op DATA helpen niet, maar ik weet zeker dat je het probleem hebt genageld. Ik vermoed dat als je een open hendel, die zoek ed ergens in het midden is, vastbindt, dat Tie :: File eerst teruggaat tot het begin.
toegevoegd de auteur Joel Berger, de bron
@mob, hmmm, terwijl ik het ermee eens ben dat dit voelt alsof er iets beters kan zijn, ik weet niet zeker wat het zou zijn. Is er een manier om te ontdekken dat de filehandle wijst naar DATA, of een manier om in MAGA Magic te haken. Voor het testen van Tie :: Array :: CSV schrijf ik naar een Bestand :: Temp tijdelijke bestand en bind dan die handle. Als er een manier was om DATA te detecteren, zou het misschien kunnen worden onderschept en gebruikt. Toch is het interessant om hier de covers van de implementatie van de __ DATA __ -sectie te hebben getrokken.
toegevoegd de auteur Joel Berger, de bron
Ik weet niet zeker waarom ik dit de laatste tijd heb bedacht, maar het zorgt wel voor een gekke kleine quine: gist.github.com/2941467
toegevoegd de auteur Joel Berger, de bron