在 Perl 中刷新多行输出
Refresh Multi-Line Output in Perl
我正在编写一个脚本,用于检查特定状态、输出结果、休眠一小段时间然后重新开始一切。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该适用于 Mac 和 Linux。这是我目前所拥有的:
#! /usr/bin/perl
use strict;
print `tput sc`; # Store cursor position
my @lines;
while (1) {
@lines = ();
push(@lines, `tput rc`); # Restore cursor position
push(@lines, `tput ed`); # Clear from cursor to end of screen
push(@lines, `dd if=/dev/urandom bs=1 count=1`); # This is just an example
print @lines;
sleep 1;
}
只要我不在终端末尾使用光标调用脚本,它就可以正常工作 window。在后一种情况下,光标在打印后停留在 window 的末尾,因此恢复其原始位置实际上没有任何作用,下一个输出只是换行。
我怎样才能避免这种情况?
我不想调用 tput clear
或 tput init
,因为这可能会丢失任何先前的命令和输出。我正在考虑滚动 window 以便在我开始输出之前提示位于顶行,但这需要当前光标行,我看不到如何使用 tput
.
或者,我可以记住打印的行数,然后使用 tput rin
将光标移回。但是,当输出太长并且在两个或多个终端线之间被破坏时,这不起作用。
通常执行此类操作的程序要么使用屏幕上的固定位置,要么记住它们输出了多少行并跳回适当的数量。
注意大多数终端仿真 windows 通过简单地向下滚动足以使 window 显示为空白来响应清除屏幕命令可能也会有所帮助。这意味着之前在屏幕上显示的任何信息仍然可用 "up above"。只是不要每次通过 while
循环都清除屏幕。从 clear/store 组合开始可能正是您所需要的。
您可以尝试 use Curses
or use Term::ANSIScreen
无需所有这些额外进程即可更好地控制您的终端,而不是花钱购买光标控制。
额外功劳:如果您坚持 删除游标控制字符串,请不要在每次循环迭代时生成tput
命令。记录它的输出,并在每次通过时重新打印它。
将您的打印行更改为 print @ANSI_control_strings, @lines;
之类的内容可能会有额外的好处,即 scalar @lines
将准确说明如果您从反引号更改为管道打开。
我正在编写一个脚本,用于检查特定状态、输出结果、休眠一小段时间然后重新开始一切。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该适用于 Mac 和 Linux。这是我目前所拥有的:
#! /usr/bin/perl
use strict;
print `tput sc`; # Store cursor position
my @lines;
while (1) {
@lines = ();
push(@lines, `tput rc`); # Restore cursor position
push(@lines, `tput ed`); # Clear from cursor to end of screen
push(@lines, `dd if=/dev/urandom bs=1 count=1`); # This is just an example
print @lines;
sleep 1;
}
只要我不在终端末尾使用光标调用脚本,它就可以正常工作 window。在后一种情况下,光标在打印后停留在 window 的末尾,因此恢复其原始位置实际上没有任何作用,下一个输出只是换行。
我怎样才能避免这种情况?
我不想调用 tput clear
或 tput init
,因为这可能会丢失任何先前的命令和输出。我正在考虑滚动 window 以便在我开始输出之前提示位于顶行,但这需要当前光标行,我看不到如何使用 tput
.
或者,我可以记住打印的行数,然后使用 tput rin
将光标移回。但是,当输出太长并且在两个或多个终端线之间被破坏时,这不起作用。
通常执行此类操作的程序要么使用屏幕上的固定位置,要么记住它们输出了多少行并跳回适当的数量。
注意大多数终端仿真 windows 通过简单地向下滚动足以使 window 显示为空白来响应清除屏幕命令可能也会有所帮助。这意味着之前在屏幕上显示的任何信息仍然可用 "up above"。只是不要每次通过 while
循环都清除屏幕。从 clear/store 组合开始可能正是您所需要的。
您可以尝试 use Curses
or use Term::ANSIScreen
无需所有这些额外进程即可更好地控制您的终端,而不是花钱购买光标控制。
额外功劳:如果您坚持 删除游标控制字符串,请不要在每次循环迭代时生成tput
命令。记录它的输出,并在每次通过时重新打印它。
将您的打印行更改为 print @ANSI_control_strings, @lines;
之类的内容可能会有额外的好处,即 scalar @lines
将准确说明如果您从反引号更改为管道打开。