2015-09-10 2 views
0

меня возникли некоторые проблемы получения аргумент, переданный в в следующем скриптеспособ извлечь аргумент внутри PERL скрипт

echo "abc"|perl <<'EOF' 
#how to get "abc". it seems not $ARGV[0] nor in <STDIN> 
EOF 

Спасибо.

+6

[Перенаправление stdin как с трубой, так и с heredoc не будет работать.] (Http://unix.stackexchange.com/a/194046/94637) Не могли бы вы объяснить, что именно вы пытаетесь сделать и почему? – ThisSuitIsBlackNot

ответ

0

Ваш пример не использует аргумент, он использует стандартный ввод. Вы можете прочитать стандартный ввод с the I/O operators. Если вы на самом деле имеете в виду, что вам нужен аргумент, например myscript.pl --arg, я бы рекомендовал использовать Getopt::Long.

0

Вы не передали никаких аргументов скрипту Perl.

Вы перенаправили скрипт Perl, поэтому он поступает из стандартного ввода; это означает, что выход по каналам нигде не встречается и не может быть замечен Perl.

Пересмотреть, как вы ссылаетесь на свой сценарий. Может быть:

perl script.pl "abc" 

где script.pl это файл, который содержит скрипт на Perl вы использовали в качестве документа-здесь. Или просто сделать этот скрипт исполняемым (возможно, без суффикса .pl).

1

Точная командная строка, в которой у вас есть, может быть вашей проблемой, если это то, что вы на самом деле выполняете. То, что вы говорите, есть «put» abc на стандартном вводе следующей вещи в конвейере. Теперь запустите скрипт Perl, состоящий из одного комментария ».

Это ничего не сделает, потому что в этом скрипте Perl нет ничего исполняемого. Попробуйте это:

echo "abc" | perl -e 'print <STDIN>' 

Если у вас есть короткий сценарий Perl вариант -e является путь.

0

Ваша проблема в том, что и труба, и документ здесь перенаправляют STDIN. И здесь-документ выигрывает, поэтому процесс perl никогда не видит трубку; он получает скрипт на STDIN (и прочитал EOF перед запуском скрипта, так что увидит STDIN в EOF).

Наблюдайте:

$ echo "abc" | perl <<'EOF' 
print "[What have we here?]\n"; 
seek(STDIN, 0, 0); 
print <STDIN>; 
print "[Well, what do you know ...]\n"; 
EOF 
[What have we here?] 
print "[What have we here?]\n"; 
seek(STDIN, 0, 0); 
print <STDIN>; 
print "[Well, what do you know ...]\n"; 
[Well, what do you know ...] 
$ 

Мораль: Не пытайтесь смешивать трубы и здесь-документы в оболочке. :)

Смежные вопросы