在Perl中清空屏幕的最佳方法是什么?

16

最好是跨平台的东西。


控制台屏幕还是GUI屏幕? - Steve Moyer
8个回答

38
print "\033[2J";    #clear the screen
print "\033[0;0H"; #jump to 0,0

1
+1000给这位朋友,此方法不要求用户安装某些CPAN模块(以及与此相关的一切)。 - Ale Morales
12
不需要安装,但在某些平台上也无法正常工作。 - gparent
很酷,但在Windows上用什么? - Andy A.

15

CPAN可能是最好的选择。看看Term::Screen:Uni

require Term::Screen::Uni;
my $scr = new Term::Screen::Uni;

$scr->clrscr()

11

通常我使用 CPAN 中的 Term::ANSIScreen ,它为我提供各种有用的与控制台相关的功能。

use Term::ANSIScreen qw(cls);
cls();

8

来自perlfaq8的答案,关于如何清屏


要清除屏幕,只需打印特殊序列,告诉终端清除屏幕即可。一旦获得该序列,输出它以清除屏幕。
您可以使用Term::ANSIScreen模块获取特殊序列。导入cls函数(或:screen标签):
use Term::ANSIScreen qw(cls);
my $clear_screen = cls();

print $clear_screen;

如果你想处理终端控制的底层细节,Term::Cap模块也可以获取特殊序列。Tputs方法返回给定能力的字符串:

use Term::Cap;

$terminal = Term::Cap->Tgetent( { OSPEED => 9600 } );
$clear_string = $terminal->Tputs('cl');

print $clear_screen;

在Windows上,您可以使用Win32::Console模块。创建一个对象来影响您想要的输出文件句柄后,调用Cls方法:
use Win32::Console;

$OUT = Win32::Console->new(STD_OUTPUT_HANDLE);
$OUT->Cls;

如果您有一个命令行程序可以完成任务,您可以在反引号中调用它,以捕获其输出并稍后使用:
$clear_string = `clear`;

print $clear_string;

Win32::Console::Cls 不会返回可以保存的值。 - Kevin Panko
你会如何修改perlfaq中的答案以解决这个问题? - brian d foy

8
在 OS X 和 Linux 系统下,您可以使用以下 Perl 命令:
system("clear");

不知道在 Windows 下的等效操作。

编辑:Windows 的等效操作是:

system("cls");

6

如果您在谈论终端,我建议使用类似Curses库这样的工具。

有一个很好的Curses模块可以访问它,您可以像这样使用:

perl -MCurses -e '$win=new Curses;$win->clear()'

2

支持Linux和Windows操作系统:

system($^O eq 'MSWin32'?'cls':'clear');

1

我不同意上面的观点。

  1. 连接额外的模块 = 增加攻击面。
  2. 减少运行代码的数量。
  3. 代码重构。

#!/usr/bin/perl -w
use strict;

my
( $over, $cleaning );
( $cleaning ) = qq([J\033[H\033[J);
( $over ) = <<EOF;
 1. Connecting additional modules = Increase the attack surface.
 2. Reduce the Amount of Running Code.
 3. Code refactoring.
EOF

print ($cleaning.$over);

__END__
FOO BAR
\033 代表 ESC ANSI 值 27
[J 从当前行擦除屏幕到底部
[H 将光标移动到起始位置

非常好的答案,尽管我会从你的实际代码中删除不必要的$over部分。它们是将$cleaning打印到屏幕上的好动机,但并不是真正解决问题的一部分。 - joanis
1
Perl的魅力在于 - «有多种方法可以做到» ;) - haxa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接