2

perl 内から ANSI エスケープ コードを使用してカーソル位置を照会するにはどうすればよいですか?

私はしようとしています

use strict;

my $variable;

open GRABSTDOUT, '>', \$variable or die "Can't open STDOUT: $!";
select GRABSTDOUT;

print "\e[6n";
select STDOUT;

print "Cursor location is >$variable<\n";
print "Bye\n";

しかし、クエリ結果が変数によってキャッチされていません

mymachine:~/play> perl ansi.pl
Cursor location is ><
Bye
^[[36;21Rmymachine:~/play> ;21R
4

1 に答える 1

4

提案されたリンク(ターミナルでカーソルの位置を取得するにはどうすればよいですか?)を見た後、改善の余地はたくさんありますが、次のような恐ろしいコードを思いつきました。

use strict;

my $x='';
system "stty cbreak </dev/tty >/dev/tty 2>&1";
print "\e[6n";
$x=getc STDIN;
$x.=getc STDIN;
$x.=getc STDIN;
$x.=getc STDIN;
$x.=getc STDIN;
$x.=getc STDIN;
system "stty -cbreak </dev/tty >/dev/tty 2>&1";

my($n, $m)=$x=~m/(\d+)\;(\d+)/;
print "\nCursor location is $n,$m\n";
print "Bye\n";

基本的に、ANSI コード クエリを実行すると、回答は STDOUT ではなく、端末で入力したかのように STDIN に送信されます。使用できます

$x=<STDIN>;

ただし、その場合、ユーザーは応答を取得するために ENTER を押す必要があります。

getc を使用するとこれを解決できますが、私が読んだところ、扱いが難しく、移植性の問題があります。( Perl で入力を待たずにユーザー入力を取得するにはどうすればよいですか?http://perldoc.perl.org/functions/getc.html )。

于 2013-05-03T15:41:47.950 に答える