#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 (конец передачи).