меня возникли некоторые проблемы получения аргумент, переданный в в следующем скриптеспособ извлечь аргумент внутри PERL скрипт
echo "abc"|perl <<'EOF'
#how to get "abc". it seems not $ARGV[0] nor in <STDIN>
EOF
Спасибо.
меня возникли некоторые проблемы получения аргумент, переданный в в следующем скриптеспособ извлечь аргумент внутри PERL скрипт
echo "abc"|perl <<'EOF'
#how to get "abc". it seems not $ARGV[0] nor in <STDIN>
EOF
Спасибо.
Ваш пример не использует аргумент, он использует стандартный ввод. Вы можете прочитать стандартный ввод с the I/O operators. Если вы на самом деле имеете в виду, что вам нужен аргумент, например myscript.pl --arg
, я бы рекомендовал использовать Getopt::Long.
Вы не передали никаких аргументов скрипту Perl.
Вы перенаправили скрипт Perl, поэтому он поступает из стандартного ввода; это означает, что выход по каналам нигде не встречается и не может быть замечен Perl.
Пересмотреть, как вы ссылаетесь на свой сценарий. Может быть:
perl script.pl "abc"
где script.pl
это файл, который содержит скрипт на Perl вы использовали в качестве документа-здесь. Или просто сделать этот скрипт исполняемым (возможно, без суффикса .pl
).
Точная командная строка, в которой у вас есть, может быть вашей проблемой, если это то, что вы на самом деле выполняете. То, что вы говорите, есть «put» abc на стандартном вводе следующей вещи в конвейере. Теперь запустите скрипт Perl, состоящий из одного комментария ».
Это ничего не сделает, потому что в этом скрипте Perl нет ничего исполняемого. Попробуйте это:
echo "abc" | perl -e 'print <STDIN>'
Если у вас есть короткий сценарий Perl вариант -e
является путь.
Ваша проблема в том, что и труба, и документ здесь перенаправляют 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 ...]
$
Мораль: Не пытайтесь смешивать трубы и здесь-документы в оболочке. :)
[Перенаправление stdin как с трубой, так и с heredoc не будет работать.] (Http://unix.stackexchange.com/a/194046/94637) Не могли бы вы объяснить, что именно вы пытаетесь сделать и почему? – ThisSuitIsBlackNot