2016-01-20 37 views
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 ... 
+0

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

+0

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

+0

Teraz mam trzy możliwości. Próbowałem już rozwiązania 'latin1'. Może trzymam się tego. –

Odpowiedz

5

Można wykorzystać method read() od class IO::Handle do odczytu binarnego:

#!/usr/local/bin/perl6 

use v6; 

my $result = $*IN.read(512); 
$*OUT.write($result); 

Następnie:

$ printf '1\0a\n' | perl6 test.p6 | od -t x1 
0000000 31 00 61 0a 
0000004 

Nie trzeba BINMODE w Perl 6, od kiedy można zdecydować, aby odczytać dane jako binarny lub jako tekst, zależy od tego, sposoby korzystania.