2012-02-13 9 views
0

印刷する代わりに、行と列を変数に取り込む方法はありますか(ここでは^[[12;1R)?端末制御のエスケープシーケンス: " e [6n"で行と列をキャッチする方法は?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 

print "\n" x 10; 

say "\e[6n"; 
+0

私がしようとしていましたTerm :: TermKey'を使うことを提案していますが、実際にはまだそれをサポートしていないことに気付きました。 Hrmmm .. 私はこれを機能の要点の要点と考え、私が思いつくものを見ていきます – LeoNerd

答えて

0

私はこれを見つけた:それはしばらく時間がかかった

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Term::ReadKey; 

ReadMode 4; 

system('clear') == 0 or die $?; 

print "\e[6n"; 
my ($x, $y) = getch(); 
say "Col: $x - Row: $y"; 


print "Hello world\n" x 6; 

print "\e[6n"; 
($x, $y) = getch(); 
say "Col: $x - Row: $y"; 


print "String\n" x 5; 
print "go to column 21 -> |"; 


print "\e[6n"; 
($x, $y) = getch(); 
say "Col: $x - Row: $y"; 

ReadMode 0; 

sub getch { 
    my $c = ReadKey 0; 
    if ($c eq "\e") { 
     my $c = ReadKey 0.10; 
     if ($c eq '[') { 
      my $c = ReadKey 0; 
      if ($c =~ /\A\d/) { 
       my $c1 = ReadKey 0; 
       if ($c1 ne '~') { 
        my $y = 0 + $c; 
        while (1) { 
         last if $c1 eq ';'; 
         $y = 10 * $y + $c1; 
         $c1 = ReadKey 0; 
        } 
        my $x = 0; 
        while (1) { 
         $c1 = ReadKey 0; 
         last if $c1 eq 'R'; 
         $x = 10 * $x + $c1; 
        } 
        return $x, $y; 
       } 
      } 
     } 
    } 
} 
0

は申し訳ありませんが、私は質問を更新するのを忘れ、その後とっくの昔、この機能を追加;)

use Term::TermKey; 

my $termkey = Term::TermKey->new(\*STDIN); 

STDOUT->autoflush(1); 
print "\e[6n"; 

while($termkey->waitkey(my $key) == RES_KEY) { 
    if($key->type_is_position) { 
     printf "Position is %d, %d\n", $key->col, $key->line; 
     last; 
    } 
} 
関連する問題