Неожиданное поведение при использовании Tie :: File на __DATA__ - PullRequest
3 голосов
/ 28 октября 2011

Пытаясь ответить на старый вопрос умным способом, я попытался сделать это, не зная, удастся ли это:

#!/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' ,atad@ ym (eit{ ) atad@ ( hcaerof;tnirp    }{ ) atad@ ( hcaerof;esrever ralacs tnirp    }__ATAD__enoowteerhtruofevifxis

Как, черт возьми, попытаться связать __DATA__ с Tie::File, связал ли он сценарий, и chomp тоже??

1 Ответ

4 голосов
/ 28 октября 2011

Файловый дескриптор DATA - это просто открытый файловый дескриптор файла, который ссылается на него.Он обладает некоторой дополнительной магией, с которой при первом чтении он ищет первый байт после токена __DATA__ или __END__ в вашей программе, давая вам ожидаемое поведение.

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

Я подозреваючто если вы сначала позвоните tell DATA (или, может быть, seek DATA,0,1) перед tie, он будет в правильном положении и будет "работать", как вы ожидали.

...