Как передать 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 оператор, подключенный к нему, должен содержать переменную ошибки $! предоставить информацию о том, почему открытие провалилось.