Нечаканае паводзіны пры выкарыстанні Tie :: Файл на __DATA__

Спрабуючы адказаць на стары пытанне ў разумным спосабам, я буду спрабаваць гэта, не ведаючы, калі гэта атрымаецца:

#!/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

Я чакаў, што гэта альбо праца, альбо памерці; што я атрымаў, быў нечаканым:

#!/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

Як жа спроба прымайстраваць __ ДАДЗЕНЫЯ __ у Tie :: Файл зрабіў гэта звязаць сцэнар, і грызці гэта таксама?!

3

1 адказы

<Код> DATA указатель_на_файл толькі адкрыты файл у файл, які спасылаецца на яго. Ён мае дадатковую магію, што першы раз, калі ён счытваецца з, яна імкнецца першага байта пасля __ ДАДЗЕНЫЯ __ або __ END __ лексема ў вашай праграме, што дае вам паводзіны, якое вы чакаеце ,

Калі вы звязваеце * DATA , вы атрымліваеце ў шляху першага чытання магіі, і атрымаць дэскрыптар зыходнага файла, размешчанага ў верхняй частцы файла.

Я падазраю, што калі вы выклікаеце сказаць DATA першы (ці, магчыма, шукаць DATA, 0,1 ) перад вамі гальштук гэта, ён будзе ў правільнае становішча і «праца», як вы чакалі.

4
дададзена
Пляма на. Таксама ў дачыненні да грызці , Tie :: Файл гэта аўтаматычна чмяканне, калі вы ня скажаце яму гэтага не рабіць.
дададзена аўтар Eric Strom, крыніца
@Joel Berger - твая праўда. Там у шукаць $ файл, 0,0 выклік на пачатку Tie :: Файл . Можа быць, варта паведаміць пра памылку? :-)
дададзена аўтар mob, крыніца
Непераможная каманда тэг атрымлівае яго хутка. Гэта было лепшым цікаўнасцю, а ў горшай памылцы. Дзякуючы.
дададзена аўтар Joel Berger, крыніца
<Код> сказаць і шукаць на DATA не дапамагае, але я ўпэўнены, што ў вас ёсць праблема прыбіла. Я падазраю, што калі вы звязваеце адкрытую ручку, якая была шукаць Эда дзесьці пасярэдзіне, што Tie :: Файл спачатку ідзе назад пачатак.
дададзена аўтар Joel Berger, крыніца
@mob, хммм, у той час як я згодны, што гэта адчувае, што можа быць што-то лепш, я не ўпэўнены, што гэта будзе. Ці ёсць які-небудзь спосаб, каб выявіць, што FILEHANDLE паказвае на дадзеныя, ці нейкім чынам падключыць да магіі дадзеных. Для тэставання Tie :: Масіў :: CSV Я пішу ў Файл :: Temp TempFile і затым звязаць гэтую ручку. Калі ёсць нейкі спосаб выяўлення DATA, магчыма, гэта можа быць перахопленыя і выкарыстаныя. Тым не менш яго цікава нацягнулі коўдру з рэалізацыі __ ДАДЗЕНЫЯ __ раздзел тут.
дададзена аўтар Joel Berger, крыніца
Не ведаю, чаму я думаў пра гэта ў апошні час, але гэта дазваляе дурной маленькай Куін: gist.github.com/2941467