perl Как читать аргумент командной строки, как будто это содержимое файла

#file #perl #command-line

#файл #perl #командная строка

Вопрос:

У меня есть функция, которая принимает имя файла и печатает содержимое файла

 #test.pl
while (<>) {
    print $_;
}
exit(0);
 

Я хочу запустить это в командной строке, за исключением того, что вместо имени файла я хочу использовать фактическое содержимое в качестве параметра без изменения сценария, аналогично анонимному FIFO (например, оператору «<(…)» в оболочке), чтобы заменить строку имени файла на ее содержимое?

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

1. Непонятно, о чем вы спрашиваете. <> уже можно читать из stdin (кстати, вы должны использовать <<>> ). Что вы имеете в виду, когда говорите «у меня есть функция»?

2. Если вы укажете имя файла ‘-‘, то perl интерпретирует это как «чтение из STDIN», однако это также поведение по умолчанию, если вы вообще не указываете имя файла. В bash командной оболочке вы можете сделать что-то вроде этого: test.pl <<<"some content here which bash will supply on STDIN"

Ответ №1:

Это вопрос оболочки, но вы не указали, какая оболочка.

sh

Проще всего просто передать данные в STDIN вместо этого.

 printf 'foo bar' | test.pl

printf 'foonbarn' | test.pl

test.pl <<'.'
foo
bar
.
 

bash

В дополнение к решениям для sh , вы также можете использовать следующее:

 test.pl <<<'foo bar'

test.pl <<<

Последний позволяет избежать использования STDIN. Это (внутренне) сложнее, чем другие решения, но позволяет передавать несколько "виртуальных файлов".


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

1. Спасибо, что сработало. Однако это решение не работает, когда в скрипте есть несколько аргументов. Возможно ли передать данные в STDIN только для последнего параметра?

2. Как указано в ответе, последний делает.

3. Я прошу прощения за последний пример, если я хочу использовать несколько аргументов, я бы просто сделал test.pl ARG1 <( printf 'foonbarn' ) , где <(printf 'foonbar n' ) - это ARG2 ?

4. ДА. Для других решений вы можете сделать это, только если другие аргументы являются параметрами ( test.pl --foo=bar <<<'foo bar' нормально, но test.pl' file.txt file2.txt <<<'foo bar' не нормально)

foonbarn'

test.pl <( printf 'foonbarn' )
Последний позволяет избежать использования STDIN. Это (внутренне) сложнее, чем другие решения, но позволяет передавать несколько «виртуальных файлов».

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

1. Спасибо, что сработало. Однако это решение не работает, когда в скрипте есть несколько аргументов. Возможно ли передать данные в STDIN только для последнего параметра?

2. Как указано в ответе, последний делает.

3. Я прошу прощения за последний пример, если я хочу использовать несколько аргументов, я бы просто сделал test.pl ARG1 <( printf 'foonbarn' ) , где <(printf ‘foonbar n’ ) — это ARG2 ?

4. ДА. Для других решений вы можете сделать это, только если другие аргументы являются параметрами ( test.pl --foo=bar <<<'foo bar' нормально, но test.pl' file.txt file2.txt <<<'foo bar' не нормально)