2012-04-16 2 views
0

Term::ReadKey:Термин :: ReadKey :: ReadKey: Почему MS Windows ведет себя иначе, чем Linux?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Term::ReadKey; 

my $key; 

ReadMode 4; 
print "Enter a key: "; 
$key = ReadKey(); 
printf "|%s|\n", $key // 'undef'; 
$key = ReadKey(-1); 
printf "|%s|\n", $key // 'undef'; 
$key = ReadKey(-1); 
printf "|%s|\n", $key // 'undef'; 
ReadMode 0; 

say "END"; 

Когда я запускаю этот скрипт на Windows, или Linux по работе с прессой k я оба раза этот выход:

Enter a key: |k| 
|undef| 
|undef| 
END 

Когда я нажимаю «ключ» Up я получаю

Enter a key: | 
|[| 
|A< 
END 

на Linux, но в Windows скрипт останавливается:

Enter a key: 

Почему вместо этого я не вижу здесь каких-то странных знаков?

ответ

3

Проще говоря, термин :: ReadKey предполагает терминалы Unixy, которые Windows не предоставляет (если вы не используете Cygwin).

Вместо этого вы можете попробовать Win32::Console. Или могут быть какие-то заклинания, которые заставят Term :: ReadKey работать - удачи в этом.

+0

Документация звучит более оптимистично: «Одна из основных целей - максимально упростить функции как можно более переносимые, поэтому вы можете просто подключить« использование термина :: ReadKey »к любой архитектуре и иметь хорошую вероятность того, что она работает. ' –

1

Вы не можете получить ключи от интерфейса, который дает вам символы. Вот почему у вас есть целая куча вещей для одного ключа.

На стороне unix ключи были преобразованы в последовательные escape-последовательности терминала, которые вам нужно выяснить самостоятельно.

В Windows вы можете сами получить ключи, но, очевидно, не из интерфейса, который дает вам такие символы, как ReadKey, по-видимому.

Я недавно showed Как получить ключи в Windows. Не знаю, как это сделать в UNIX.

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