Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中刷新多行输出_Perl_Terminal_Tput - Fatal编程技术网

在Perl中刷新多行输出

在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

我正在编写一个脚本,用于检查特定状态,输出结果,短暂睡眠,然后重新开始所有操作。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该在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;
}
只要我没有在终端窗口末尾使用光标调用脚本,它就可以正常工作。在后一种情况下,光标在打印后停留在窗口的末尾,因此恢复其原始位置实际上没有任何作用,下一个输出只是转到一个新行

我怎样才能避免呢

我不想调用
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