perl 是否可以使用Term::ReadKey清除终端?

p3rjfoxz  于 2023-02-13  发布在  Perl
关注(0)|答案(3)|浏览(112)

有没有办法使用Term::ReadKey模块来实现这一点?

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

say( "Hello!\n" x 5 );
sleep 2;

my $scr = Term::Screen->new();
$scr->clrscr();
gojuced7

gojuced71#

我不知道为什么Term::ReadKey会提供这样的特性,或者它是否会提供这样的特性。

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

*clrscr = $^O eq 'MSWin32'
        ? sub { system('cls') }
        : sub { system('clear') };

print "Hello\n" for 1 .. 5;
sleep 2;
clrscr();
u5i3ibmn

u5i3ibmn2#

不确定为什么要使用Term::Readkey来清除屏幕。它肯定没有这个功能。您是否尝试使用标准Perl安装的一部分?您可以使用Term::Caps,它是标准Perl安装的一部分。不幸的是,它需要系统上有Termcaps文件,而Windows没有。

use Term::Cap;

#
# Use eval to catch the error when TERM isn't defined or their is no
# Termcap file on the system.
#
my $terminal;
eval {$terminal = Term::Cap->Tgetent();};

#
# Use 'cl' to get the Screen Clearing sequence
#

if ($@) {  #Most likely a Windows Terminal
    system('cls');            #We really should be doing the 2 line below
    # my $clear = "\e[2J";    #But, it doesn't seem to work.
    # print "$clear";         #Curse You! I'll get you yet Bill Gates!
} else {   #A Real Computer
    my $clear = $terminal->Tputs('cl');
    print "$clear";
}
print "All nice and squeeky clean!\n";

如果是Windows终端,我尝试打印ANSI转义序列,但似乎不起作用。
我讨厌做系统调用,因为有安全风险。如果有人在你身上修改了cls命令怎么办?

mm9b1k5b

mm9b1k5b3#

Term::Readkey不直接提供此功能,但通常在终端中清除屏幕的组合键为^L(Control-L):
| 二进制|十月|12月|六角|上升|塞姆|正文|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 00001100|十四|十二|(c)秘书长的报告|ff|^L|换页(下一页)|
因此,如果您想使用该模块将其构建到应用程序中,可以执行以下操作:

use Term::ReadKey;

# Perform a normal read using getc

my $key = ReadKey( 0 );

# If ^L was pressed, clear the screen

if ( ord $key == 12 ) { print "\e[2J" }

上面的例子使用了原始转义序列\e[2J来清除整个屏幕。你也可以使用以下替代方法:
| 序列|功能|
| - ------|- ------|
| \e[J|从光标到屏幕结束清除|
| \e[0J|从光标到屏幕结束清除|
| \e[1J|从光标清除到屏幕开头|
| \e[2J|清除整个屏幕|
| \e[K|从光标到行尾清除|
| \e[0K|从光标到行尾清除|
| \e[1K|从光标到行首清除|
| \e[2K|清除整行|
转义码\e表示ASCII字符数27:
| 二进制|十月|12月|六角|上升|塞姆|正文|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 零零零一一零一一|三十三|二十七|1b类|埃斯克|^[|逃逸|
有关详细信息,请参见VT100 Escape Sequences
这甚至应该工作,如果你使用Windows,因为apparently this works there nowadays

相关问题