2016-01-20 104 views
5

我該如何在Perl6中編寫這個Perl5代碼?Perl6:如何讀取STDIN原始數據?

my $return = binmode STDIN, ':raw'; 
if ($return) { 
    print "\e[?1003h"; 
} 

評論到cuonglm的答案。

我已經使用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 ]; 
      } 
     } 
    } 
} 

但隨着STDIN設置爲UTF-8我得到的錯誤與$x$y大於127 - 32:

Malformed UTF-8 at ... 
+0

utf-8是一種非二進制安全的可變長度編碼;取決於你想要做什麼,或者使用'.decode('latin1')',或者只保留數字值並用'$ c3 =='M'替換'$ c3 eq'M''。 ord' – Christoph

+0

我認爲你的代碼現在不能正常工作的唯一原因是你使用.decode,正如Christoph所建議的那樣,你可以使用latin1來獲得一個不會失敗的字符串,而不管你輸入了什麼數據。否則,我建議你只要返回$ * IN.read(1)[0]就只獲得單字節值。 – timotimo

+0

現在我有三種可能性。我已經嘗試過'latin1'解決方案。也許我堅持下去。 –

回答

5

您可以使用method read()class IO::Handle執行二進制讀數:

#!/usr/local/bin/perl6 

use v6; 

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

然後:

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

你不需要binmode在Perl 6的,因爲當你可以決定讀取數據的二進制或文字,取決於你用什麼方法。