Как мне сбросить данные из STDIN, когда я закончу с ним?

#perl #stdin

#perl #stdin

Вопрос:

У меня есть программа, которая получает данные из канала содержимого тестового файла ( cat file ). Обычно я использую оператор diamond для получения данных построчно из STDIN, до последней строки. Проблема в том, что я хотел бы повторно использовать одни и те же данные для более чем одной подпрограммы. Как можно сбросить чтение STDIN, чтобы данные можно было снова прочитать с первой строки?

 sub downloadsrt {
    print "Printing list of subtitle files in downloadable form..n";
    while (<>) {
        chomp($_);
        (my $fname,my $path, my $suffix) = fileparse($_);
        $_=$fname;
        my ($name, $ext) = $fname =~ /(.*).(.*)/;  
        #For srt
        my $newfile=$path.$name.".$ext";
        $newfile =~ s/s/ /g; 
        $newfile =~ s//root/http://$localip/;
        print $newfile."n";
    }
}
sub dummysub {
    while (<>) {
        // Something else
    }
}

downloadsrt;
dummysub;
  

Я хотел бы получить доступ к STDIN, используя несколько подпрограмм, и каждая должна получать данные из первой строки STDIN.

Если я не ошибаюсь, это не лексически ограничено.

Комментарии:

1. Короткий ответ: вы не можете. Однако вы можете хранить содержимое в массиве или запускать свою логику параллельно для каждой строки, прочитанной из STDIN.

2. IO::Mux возможно?

Ответ №1:

Как было предложено @mpapec, вам необходимо сохранить данные из STDIN в массив:

 my @stdin = <>;
mysub_1(@stdin);
mysub_2(@stdin);
  

Комментарии:

1. Как я могу проверить <> , содержит ли какие-либо данные, прежде чем назначать их массиву? В противном случае первая команда здесь ожидает получения данных.

2. <> это не структура данных, а оператор ввода-вывода, поэтому он не содержит никаких данных. Учитывая, что вы получаете свои данные из cat команды, это не должно быть проблемой, поскольку вы всегда получаете символ EOT (конец передачи).