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 ...
utf-8是一種非二進制安全的可變長度編碼;取決於你想要做什麼,或者使用'.decode('latin1')',或者只保留數字值並用'$ c3 =='M'替換'$ c3 eq'M''。 ord' – Christoph
我認爲你的代碼現在不能正常工作的唯一原因是你使用.decode,正如Christoph所建議的那樣,你可以使用latin1來獲得一個不會失敗的字符串,而不管你輸入了什麼數據。否則,我建議你只要返回$ * IN.read(1)[0]就只獲得單字節值。 – timotimo
現在我有三種可能性。我已經嘗試過'latin1'解決方案。也許我堅持下去。 –