5
Jak mogę napisać ten kod Perl5 w Perl6?Perl6: Jak odczytać surowe dane STDIN?
my $return = binmode STDIN, ':raw';
if ($return) {
print "\e[?1003h";
}
Komentarz do odpowiedzi cuonglm użytkownika.
jestem już przy użyciu read
:
my $termios := Term::termios.new(fd => 1).getattr;
$termios.makeraw;
$termios.setattr(:DRAIN);
sub ReadKey {
return $*IN.read(1).decode();
}
sub mouse_action {
my $c1 = ReadKey();
return if ! $c1.defined;
if $c1 eq "\e" {
my $c2 = ReadKey();
return if ! $c2.defined;
if $c2 eq '[' {
my $c3 = ReadKey();
if $c3 eq 'M' {
my $event_type = ReadKey().ord - 32;
my $x = ReadKey().ord - 32;
my $y = ReadKey().ord - 32;
return [ $event_type, $x, $y ];
}
}
}
}
Ale ze standardowego wejścia ustawione na UTF-8 pojawiają się błędy z $x
lub $y
większa niż 127 - 32:
Malformed UTF-8 at ...
utf-8 to kodowanie o zmiennej długości, które nie jest binarnie bezpieczne; w zależności od tego, co próbujesz zrobić, użyj '.decode ('latin1')' lub po prostu zachowaj wartości numeryczne i zamień takie rzeczy jak '$ c3 eq 'M'' z' $ c3 ==' M '. ord' – Christoph
Myślę, że jedynym powodem, dla którego twój kod obecnie nie działa jest to, że używasz .decode, jak sugeruje Christoph, możesz użyć łacińskiego1, aby uzyskać ciąg, który nigdy nie zawiedzie bez względu na dane, które dostaniesz. , Proponuję po prostu zwrócić $ * IN.read (1) [0], aby uzyskać tylko wartość jednobajtową. – timotimo
Teraz mam trzy możliwości. Próbowałem już rozwiązania 'latin1'. Może trzymam się tego. –