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";
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" }
3条答案
按热度按时间gojuced71#
我不知道为什么Term::ReadKey会提供这样的特性,或者它是否会提供这样的特性。
u5i3ibmn2#
不确定为什么要使用
Term::Readkey
来清除屏幕。它肯定没有这个功能。您是否尝试使用标准Perl安装的一部分?您可以使用Term::Caps,它是标准Perl安装的一部分。不幸的是,它需要系统上有Termcaps文件,而Windows没有。如果是Windows终端,我尝试打印ANSI转义序列,但似乎不起作用。
我讨厌做系统调用,因为有安全风险。如果有人在你身上修改了
cls
命令怎么办?mm9b1k5b3#
Term::Readkey
不直接提供此功能,但通常在终端中清除屏幕的组合键为^L
(Control-L):| 二进制|十月|12月|六角|上升|塞姆|正文|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 00001100|十四|十二|(c)秘书长的报告|ff|^L|换页(下一页)|
因此,如果您想使用该模块将其构建到应用程序中,可以执行以下操作:
上面的例子使用了原始转义序列
\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。