Как я могу открыть STDIN второй раз?

Допустим, у меня есть эти данные

John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172

И у меня есть этот код

while( my $line = <>)  {
    print $line;
}
while( my $line = <>)  {
    print $line;
}

Я хочу это напечатать

John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172
John Smith  25  O   ATG 180
Peter Jackson   40  AB  GGTA    173
Carl Anderson   32  A   GGT 172
3
Billi Furrkas 8 Мар 2012 в 16:15

3 ответа

Лучший ответ

Вы не можете, вы опустошили поток. Если вы хотите использовать его снова, поместите строки в массив.

my @lines;
while( my $line = <>)  {
    print $line;
    push @lines, line;
}

foreach my $line (@lines)  {
    print $line;
}

Или напишите в файл и получите дескриптор файла.

9
Tom 8 Мар 2012 в 12:20

Если к файлу прикреплен STDIN, вы можете seek(STDIN, 0, 0), но в целом вы не можете делать то, о чем просите.

5
salva 8 Мар 2012 в 12:26

Вы всегда можете получить имя файла вместо использования STDIN.

$fn = shift;
open(MyFile,"< $fn") || die "cant open $fn $!";
while(MyFile) { } # first time thru
seek MyFile,0,0
while(MyFile) { } # second time thru

Если это список файлов, вы можете их просмотреть.

0
Pete 29 Окт 2018 в 15:02