Как заставить perl обрабатывать аргументы ТОЛЬКО из стандартного ввода, а не из файла в командной строке? - PullRequest
0 голосов
/ 09 января 2020

Если у меня есть эта встроенная команда:

perl -pi -e 's/([\da-f]{2})([\da-f]{2})\s?/\\x$1\\x$2\t/g'

, которая просто заменяет гекс с четырьмя ди git и добавляет к нему «x». -i используется без имен файлов в командной строке, чтение из STDIN. Итак, для параметров: 0000 0776, результаты равны \x00\x00\x07\x76

Я знаю, что если -n или -p (с печатью) вызваны, perl принимает <> алмаз. Но я хочу передать args только ПОСЛЕ команды, но perl предполагает, что это файлы для чтения. Так как же заставить -n или -p считать аргументы после команды обычными аргументами для <> в программе, а не аргументы как файлы для чтения?

Кроме того, я не понимаю роли i здесь. Если бы я не включил его, я бы добавил строку args строка за строкой (как это делает <>), но с i он принимает все мои аргументы одновременно?

Ответы [ 2 ]

6 голосов
/ 09 января 2020

Если аргументов нет (т. Е. Если @ARGV пусто), то ваш однострочный скрипт (который неявно использует <>) будет читать входные данные из STDIN. Таким образом, решение состоит в том, чтобы очистить @ARGV во время компиляции.

perl -pi -e 'BEGIN{@ARGV=()}
             s/([\da-f]{2})([\da-f]{2})\s?/\\x$1\\x$2\t/g'

Другое решение: заставить ARGV (неявный дескриптор файла, из которого читает базовый оператор <>) указывать на STDIN. Это решение не затирает ваш @ARGV, если таковой имеется.

perl -pi -e 'BEGIN{*ARGV=*STDIN}
             s/([\da-f]{2})([\da-f]{2})\s?/\\x$1\\x$2\t/g'
4 голосов
/ 09 января 2020

Опция -p эквивалентна следующему коду :

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

-n такая же без блока продолжения. Нет способа изменить то, из чего он читает (что, к сожалению, так как <<>> и <STDIN> являются более безопасными параметрами), но довольно легко скопировать его с вашей модификацией (проверка ошибок здесь редко требуется):

perl -e 'while (<STDIN>) { s/([\da-f]{2})([\da-f]{2})\s?/\\x$1\\x$2\t/g } continue { print }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...