Как я могу заставить Perl принимать данные из STDIN по одному символу за раз? - PullRequest
6 голосов
/ 30 декабря 2011

Я немного новичок в Perl (по сравнению с людьми здесь). Я знаю достаточно, чтобы писать программы для выполнения многих задач через командную строку. В какой-то момент я решил написать игру командной строки, которая создала лабиринт и позволила мне его решить. Помимо качественной графики, мне не хватало только возможности использовать элементы управления WASD без нажатия клавиши ввода после каждого движения, которое я делал в лабиринте.

Чтобы моя игра работала, я хочу, чтобы Perl использовал один символ в качестве ввода из STDIN, не требуя, чтобы я использовал что-то для разделения ввода, как по умолчанию \n. Как бы я это сделал?

Я пытался найти простой ответ в Интернете и в имеющейся у меня книге, но, похоже, ничего не нашел. Я попытался установить $/="", но это, казалось, обошло весь ввод. Я думаю, что на мой вопрос может быть действительно простой ответ, но я также боюсь, что это может быть невозможно.

Кроме того, $/="" фактически пропускает ввод или принимает его так быстро, что предполагает, что ввода нет, если я еще не нажимаю клавишу?

Ответы [ 3 ]

4 голосов
/ 30 декабря 2011

IO::Prompt можно использовать:

#!/usr/bin/env perl

use strict;
use warnings;

use IO::Prompt;

my $key = prompt '', -1;
print "\nPressed key: $key\n";

Соответствующая выдержка из perldoc -v '$/', относящаяся к настройке $/ = '':

Разделитель входных записей, новая строка по умолчанию.Это влияет на представление Perl о том, что такое «линия».Работает как переменная RS в awk, включая , обрабатывая пустые строки как терминатор, если для него задана нулевая строка (пустая строка не может содержать пробелов или табуляций).

1 голос
/ 30 декабря 2011

Если вы используете * nix, вы найдете Проклятия полезными.

У него есть метод getch, который делает то, что вы хотите.

Term :: TermKey также выглядит как потенциальное решение.

0 голосов
/ 23 марта 2018

Кратчайший путь для достижения вашей цели - использовать эту специальную конструкцию:

$/ = \1;

Это говорит perl читать по одному символу за раз. В следующий раз, когда вы читаете из любого потока (не только STDIN)

my $char = <STREAM>;

это будет читать 1 символ за назначение. From perlvar"Установка $ / для ссылки на целое число, скаляр, содержащий целое число, или скаляр, который может быть преобразован в целое число, будет пытаться читать записи вместо строк, с максимальным размером записи, являющимся ссылочным целым числом символов. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...