Путаница с переключателем командной строки Ruby -p

-p ==> предположим, что цикл похож на -n, но строка печати также похожа на sed.

Теперь я попробовал ниже, чтобы увидеть, как это работает:

@ubuntu:~$ ruby -p
hi #<~~ pressed on ENTER
   # nothing printed baack 
\t
-:5: syntax error, unexpected $undefined, expecting $end
@ubuntu:~$

В приведенном выше примере после ввода «привет» при нажатии клавиши «ENTER» появляется пустая строка, как указано выше. Я думал, что на выходе будет привет.

Сейчас попробовал немного по другому:

@ubuntu:~$ ruby -p -e '"hi"'
hi  #<~~ pressed on ENTER
hi
ttt #<~~ pressed on ENTER
ttt
\t  #<~~ pressed on ENTER
\t
EOF #<~~ pressed on ENTER
EOF

Но здесь кажется, что -p сработало, как и ожидалось. Но Loop превращается в бесконечное Loop. Я пытался EOF закончить этот цикл, но этого не произошло, а он тоже распечатался.

Может ли кто-нибудь помочь мне понять, почему эти различия?


person Arup Rakshit    schedule 13.02.2013    source источник


Ответы (2)


-p сделает:

- Read a line from input
- Pass the input to the code
- If the code executes successfully, print the input

Если вы не укажете имя файла или -e в командной строке, он просто использует стандартный ввод, ничего не выполняя. -p не печатается, так как не указан код.

Когда вы просто вводите -pe '"hi"', он будет генерировать строку hi каждый раз, когда вы вводите строку (но она находится в памяти, но не выводится) и печатает, как указано -p.

EOF, который вы указали, не является индикатором EOF. Это строка "EOF". Если вы хотите отправить сигнал EOF на ruby, нажмите Ctrl+Z и Enter

person texasbruce    schedule 13.02.2013
comment
Да! ваш ответ имеет смысл. Ctrl+Z Я уже пытался, и цикл прерывается, но я забыл обновить его здесь. Но объяснение -p идеально, и я просто перестал задаваться вопросом, прочитав ваш ответ. Я тоже догадался об этом, но не получил никакого источника, подтверждающего мою догадку :) Не могли бы вы также поделиться со мной источником, который поможет вам уверенно ответить на этот вопрос? - person Arup Rakshit; 14.02.2013

Ваш первый эксперимент не удался, потому что без программы интерпретатор будет читать стандартный ввод до EOF. Таким образом, вы оказались в запутанной ситуации: сначала вам нужно ввести программу из стандартного ввода, затем ^D или любой другой EOF на вашей консоли, и затем ваша программа будет start, и он будет считывать стандартный ввод снова для реализации постоянного цикла.

Во втором случае вы, по крайней мере, избегаете двойного стандартного входа. И это не совсем бесконечный цикл, когда вы вводите EOF, он завершится.

person DigitalRoss    schedule 13.02.2013