【问题标题】:Refresh Multi-Line Output in Perl在 Perl 中刷新多行输出
【发布时间】:2015-02-26 05:24:05
【问题描述】:

我正在编写一个脚本,该脚本旨在检查某个状态、输出结果、休眠一小段时间,然后重新开始一切。输出由多行组成,我希望脚本更新输出,这意味着再次在同一行上打印。它应该可以在 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;
}

只要我不在终端窗口末尾使用光标调用脚本,它就可以正常工作。在后一种情况下,光标在打印后停留在窗口的末尾,因此恢复它的原始位置实际上没有任何作用,下一个输出只是换行。

我怎样才能避免这种情况?

我不想调用tput cleartput init,因为这可能会丢失任何先前的命令和输出。我正在考虑滚动窗口,以便在我开始输出之前提示位于顶行,但这需要当前光标行,我无法看到如何使用 tput 获得它。

或者,我可以记住打印的行数,然后使用tput rin 将光标移回。但是,当输出太长并且跨越两条或更多终端线时,这不起作用。

【问题讨论】:

    标签: perl terminal tput


    【解决方案1】:

    通常执行此类操作的程序要么使用屏幕上的固定位置,要么记住它们输出了多少行并跳回适当的数量。

    请注意,大多数终端仿真窗口通过简单地向下滚动到足以使窗口显示为空白来响应清除屏幕命令,这也可能会有所帮助。这意味着先前在屏幕上的任何信息仍然可以“在上方”使用。只是不要在每次通过while 循环时清除屏幕。从清除/商店组合开始可能正是您所需要的。

    您可以尝试使用use Cursesuse Term::ANSIScreen 来更好地控制您的终端,而不需要所有这些额外的过程。

    额外功劳:如果您坚持对光标控制字符串进行脱壳,请不要在循环的每次迭代中生成tput 命令。记录它的输出,每次通过时重新打印。

    将打印行更改为 print @ANSI_control_strings, @lines; 之类的内容可能会带来额外的优势,即 scalar @lines 将准确说明如果您从反引号更改为管道打开,您可能想要跳回多少行。

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 2018-07-20
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多