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 代码查询时,回复会发送到 STDIN,就好像您在终端上输入了它一样,而不是我想的 STDOUT。您可以使用

$x=<STDIN>;

但在这种情况下,用户需要按 ENTER 才能捕获回复。

使用 getc 解决了这个问题,但从我读到的内容来看它很棘手并且存在可移植性问题。(如何在不等待输入 Perl 的情况下获取用户输入?http ://perldoc.perl.org/functions/getc.html )。

于 2013-05-03T15:41:47.950 回答