Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

__קזוז__

0 views
Skip to first unread message

Dmitry Ivanov

unread,
Feb 3, 2021, 8:32:20 PM2/3/21
to
Здравствуйте, All.

Глупый вопрос про __DATA__

Есть очень условный скрипт

my $i;

for $i ( 1 .. 3 ) {

while (<DATA>) {

print "$i+$_\n";
}
}

__DATA__
4
5
6

так вот на первой итерации ($i = 1 DATA "заканчивается". Как
начатьчитать ее сначала?

Я много гуглил, нагуглилЮ что специальный файловый дескриптор.
Пробовал его закрывать close и через seek гонять. Hе получается.

Подскажите, плз, что делать

--
С уважением,
Dmitry


Evgeny Chevtaev

unread,
Feb 3, 2021, 10:12:20 PM2/3/21
to
Hi Dmitry!

Thursday February 04 2021 04:24, Dmitry Ivanov wrote to All:

DI> Глупый вопрос про __DATA__
DI> Есть очень условный скрипт
DI> my $i;
DI> for $i ( 1 .. 3 ) {
DI> while (<DATA>) {
DI> print "$i+$_\n";
DI> }
DI> }
DI> __DATA__
DI> 4
DI> 5
DI> 6
DI> так вот на первой итерации ($i = 1 DATA "заканчивается". Как
DI> начатьчитать ее сначала?

my @data = <DATA>;

for my $i ( 1 .. 3 ) {
foreach (@data) {
print "$i+$_\n";
}
}

__DATA__
4
5
6

Так подойдёт?

With best regards,
Evgeny

Eugene Grosbein

unread,
Feb 4, 2021, 12:32:21 AM2/4/21
to
04 февр. 2021, четверг, в 04:24 NOVT, Dmitry Ivanov написал(а):

DI> Глупый вопрос про __DATA__
DI> Есть очень условный скрипт
DI> my $i;
DI> for $i ( 1 .. 3 ) {
DI> while (<DATA>) {
DI> print "$i+$_\n";
DI> }
DI> }
DI> __DATA__
DI> 4
DI> 5
DI> 6
DI> так вот на первой итерации ($i = 1 DATA "заканчивается". Как
DI> начатьчитать ее сначала?
DI> Я много гуглил, нагуглилЮ что специальный файловый дескриптор.
DI> Пробовал его закрывать close и через seek гонять. Hе получается.

Hужно понять, что в __DATA__ нет никакой магии:
встретив в первый раз обращение к <DATA>, интерпретатор perl,
уже имея открытый исходник скрипта, находит в нём __DATA__
и делает seek на начало следующей строки, так чтобы
любая работа с <DATA> происходила ровно так же,
как с любым другим файлом.

Поэтому тебе надо действовать, как с любым другим файлом,
в лоб:

my $offset = tell(DATA); # запоминаем исходное смещение
for $i ( 1 .. 3 ) {
seek(DATA, $offset, 0); # переустанавливаем указатель
while (<DATA>) { # читаем с нужной позиции
print "$i+$_\n";
}
}
__DATA__

Eugene
--
И друзей успокоив и ближних любя,
Мы на роли героев вводили себя.

Dmitry Ivanov

unread,
Feb 4, 2021, 2:17:21 AM2/4/21
to
Здравствуйте, Dmitry.

Вы писали 4 февраля 2021 г., 7:24:41:
Вопрос снимается

my $data_start = tell DATA; # save the position
print while (<DATA>);
seek DATA, $data_start, 0; # reposition the filehandle right past __DATA__
print while (<DATA>);

--
С уважением,
Dmitry

Dmitry Ivanov

unread,
Feb 10, 2021, 1:22:24 AM2/10/21
to
Здравствуйте, Evgeny.

Вы писали 4 февраля 2021 г., 11:08:58:

> Так подойдёт?

Тоже вариант, спасибо
--
С уважением,
Dmitry
0 new messages