如何在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
答案 0 :(得分:3)
在查看建议的链接(How can I get position of cursor in terminal?)之后,我想出了下面那些可怕的代码,尽管有很多改进的余地:
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代码查询时,回复会转到STDIN,就像您在终端上键入它一样,而不是我想的STDOUT。你可以使用
$x=<STDIN>;
但在这种情况下,用户需要按ENTER才能捕获回复。
使用getc解决了这个问题,但从我读到的内容来看,它很棘手并且具有可移植性问题。 (How can I get user input without waiting for enter in Perl?,http://perldoc.perl.org/functions/getc.html)。