В Perl, почему вы не можете использовать __DATA__ как доступный для поиска файловый дескриптор? - PullRequest
0 голосов
/ 30 августа 2018

Чтение данных из DATA через типичный прием slurp работает. Попытка использовать DATA в качестве дескриптора файла, для которого я могу выполнить поиск, не работает. Кто-нибудь может указать мне на очевидную ошибку, которую я должен сделать?

Код:

#!/usr/bin/env perl

use strict;
use warnings;

if ($ARGV[0] eq 'seek' ) {
    my $log_fh = \*DATA;
    $log_fh->seek(64,0);
    print "\n-- 64 --\n",join ("", <$log_fh> );
} else {
    while (<DATA>) {
        print $_;
    }
}

exit;

__DATA__
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

$ perl file_from_data.pl slurp
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

Запуск цикла while ():

$ perl file_from_data.pl slurp
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

При запуске seek (), похоже, что он начинается не с DATA , а с началом скрипта:

$ perl file_from_data.pl seek

-- 64 --
'seek' ) {
    my $log_fh = \*DATA;
    $log_fh->seek(64,0);
    print "\n-- 64 --\n",join ("", <$log_fh> );
} else {
    while (<DATA>) {
        print $_;
    }
}

exit;

__DATA__
01234567890123456789
1234567890123456789
1234567890123456789
12
X <- That X is the 64th char in
this file.
Y <- That Y is the 106th char in this file.
junk
more junk.
bye!

Это старый Perl:

$ perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux- 
thread-multi

1 Ответ

0 голосов
/ 30 августа 2018

Запускает поиск (), похоже, что он начинается не с ДАННЫЕ , а с началом скрипта

Я не думаю, что ты вообще ошибаешься. Именно так и происходит. DATA - это дескриптор файла, который открыт в вашем исходном файле. До вашего первого read() из этого дескриптора файла указатель файла располагается сразу после токена __DATA__ в файле. Но вы можете использовать seek(), чтобы переместить указатель файла на любую позицию в файле.

Полагаю, было бы сложнее реализовать дескриптор файла "особый случай", который не смог бы вернуться назад до своей начальной позиции.

...