在Perl中刷新多行输出
我正在编写一个脚本,用于检查特定状态,输出结果,短暂睡眠,然后重新开始所有操作。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该在Mac和Linux上工作。这就是我到目前为止所做的:在Perl中刷新多行输出,perl,terminal,tput,Perl,Terminal,Tput,我正在编写一个脚本,用于检查特定状态,输出结果,短暂睡眠,然后重新开始所有操作。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该在Mac和Linux上工作。这就是我到目前为止所做的: #! /usr/bin/perl use strict; print `tput sc`; # Store cursor position my @lines; while (1) { @lines = (); push(@lines, `tput rc`); # R
#! /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;
}
只要我没有在终端窗口末尾使用光标调用脚本,它就可以正常工作。在后一种情况下,光标在打印后停留在窗口的末尾,因此恢复其原始位置实际上没有任何作用,下一个输出只是转到一个新行
我怎样才能避免呢
我不想调用tputclear
或tputinit
,因为这可能会丢失以前的任何命令和输出。我正在考虑滚动窗口,以便在开始输出之前,提示符位于顶行,但这需要当前光标行,我看不出如何使用tput
获得它
或者,我可以记住打印的行数,然后使用
tput rin
将光标向后移动。但是,如果输出太长,并且在两条或多条终端线之间中断,则这种方法不起作用。通常,执行此类操作的程序要么使用屏幕上的固定位置,要么记住它们输出了多少行,然后跳回相应的数量
请注意,大多数终端仿真窗口响应清除屏幕命令时,只需向下滚动足够使窗口显示为空白即可。这意味着屏幕上以前显示的任何信息在“上方”仍然可用。只是不要每次通过while
循环时都清除屏幕。从clear/store组合开始可能正是您所需要的
您可以尝试在不使用所有这些额外进程的情况下,对终端进行更精细的控制,而不是使用光标控件
额外提示:如果您坚持对游标控制字符串进行炮击,请不要在循环的每次迭代中生成tput
命令。记录它的输出,每次都重新打印
将打印行更改为
print@ANSI\u control\u strings、@lines
还有一个额外的优势,那就是scalar@lines
可以准确地计算出如果您从backticks变为piped open,您可能需要跳回多少行。通常,执行此类操作的程序要么使用屏幕上的固定位置,或者记住他们输出了多少行,然后跳回相应的数量
请注意,大多数终端仿真窗口响应清除屏幕命令时,只需向下滚动足够使窗口显示为空白即可。这意味着屏幕上以前显示的任何信息在“上方”仍然可用。只是不要每次通过while
循环时都清除屏幕。从clear/store组合开始可能正是您所需要的
您可以尝试在不使用所有这些额外进程的情况下,对终端进行更精细的控制,而不是使用光标控件
额外提示:如果您坚持对游标控制字符串进行炮击,请不要在循环的每次迭代中生成tput
命令。记录它的输出,每次都重新打印
将打印行更改为
print@ANSI\u control\u strings、@lines
还有一个额外的优势,那就是scalar@lines
可以准确地计算出如果您从backticks变为piped open,您可能需要跳回多少行。通常,执行此类操作的程序要么使用屏幕上的固定位置,或者记住他们输出了多少行,然后跳回相应的数量
请注意,大多数终端仿真窗口响应清除屏幕命令时,只需向下滚动足够使窗口显示为空白即可。这意味着屏幕上以前显示的任何信息在“上方”仍然可用。只是不要每次通过while
循环时都清除屏幕。从clear/store组合开始可能正是您所需要的
您可以尝试在不使用所有这些额外进程的情况下,对终端进行更精细的控制,而不是使用光标控件
额外提示:如果您坚持对游标控制字符串进行炮击,请不要在循环的每次迭代中生成tput
命令。记录它的输出,每次都重新打印
将打印行更改为
print@ANSI\u control\u strings、@lines
还有一个额外的优势,那就是scalar@lines
可以准确地计算出如果您从backticks变为piped open,您可能需要跳回多少行。通常,执行此类操作的程序要么使用屏幕上的固定位置,或者记住他们输出了多少行,然后跳回相应的数量
请注意,大多数终端仿真窗口响应清除屏幕命令时,只需向下滚动足够使窗口显示为空白即可。这意味着屏幕上以前显示的任何信息在“上方”仍然可用。只是不要每次通过while
循环时都清除屏幕。从clear/store组合开始可能正是您所需要的
您可以尝试在不使用所有这些额外进程的情况下,对终端进行更精细的控制,而不是使用光标控件
额外提示:如果您坚持对游标控制字符串进行炮击,请不要在循环的每次迭代中生成tput
命令。记录它的输出,每次都重新打印
将打印行更改为print@ANSI\u control\u strings、@lines代码>可以添加adv