Как передать stdin в скрипт perl, который ищет ввод в качестве единственного параметра?
этот вопрос был необходим из лени с моей стороны, потому что у меня есть десятки сценариев, которые выполняются в простой структуре:
perl my_script.pl my_input_file
...и вывод печатается в stdout. Однако теперь я понимаю, что у меня есть определенная ситуация, в которой я хотел бы передать ввод в эти сценарии. Так, что-то вроде этого:
perl my_script.pl my_input_file | perl my_next_script.pl | perl third_script.pl > output
кто-нибудь знает способ сделать это без перекодирования всех моих скриптов, чтобы принять stdin вместо пользовательского ввода файл? Мои скрипты ищут имя файла с помощью такого оператора:
open(INPUT,$ARGV[0]) || die("Can't open the input file");
Спасибо за любые предложения!
2 ответов
использовать -
С
perl my_script.pl my_input_file | perl my_next_script.pl - | perl third_script.pl - > output
mpapec обеспечило самое простое решение. Я хотел бы порекомендовать оператора diamond:<>
.
в скрипте, где вы могли бы сделать
open my $fh, "<", $ARGV[0] or die $!;
while (<$fh>) {
...
вы можете использовать оператор diamond для замены большей части этого кода
while (<>) {
...
имя дескриптора файла будет ARGV
если вы используете имена файлов аргументов или STDIN
если не. Имя файла будет найдено в $ARGV
.
этот оператор вызывает поведение, где Perl ищет входные данные либо из аргументов имени файла, либо из стандартного ввода.
что означает, что ли вы
inputpipe | script.pl
или
script.pl inputfile.txt
оператор Диаманта примет входной сигнал как раз отлично.
Примечание:open
утверждение опасно. Вы должны использовать три аргумента open с явным режимом и лексическим дескриптором файла. The die
оператор, подключенный к нему, должен содержать переменную ошибки $!
предоставить информацию о том, почему открытие провалилось.