Perl打印线超过提示

时间:2014-04-25 08:44:23

标签: perl queue prompt term tui

我的脚本要求下载URL并将其发送到下载队列。下载的进度应该打印回来。

我找不到一种方法来将提示保持在底部并对其进行状态。 我尝试了对CPAN的搜索,但我找不到它的模块。

感谢您的帮助。

#!/usr/bin/perl
use 5.14.0;
use strict;
use warnings;
use Term::UI;
use Term::ReadLine;
use threads;
use Thread::Queue;

sub rndStr{ join'', @_[ map{ rand @_ } 1 .. shift ] }

my $q = Thread::Queue->new(); # A new empty queue
my $thr = threads->create(
  sub {
    while (defined(my $item = $q->dequeue())) {
      say "Downloading: ".$item;
      sleep 1;
      #$q->enqueue(1..10) if $item eq '10';
      $q->enqueue(rndStr rand (15)+5, 'a'..'z', 0..9);
    }
  }
);

$q->enqueue(rndStr 10, 'a'..'z', 0..9);
my $url;
my $term = Term::ReadLine->new('brand');
while ($url ne 'end'){
  $url = $term->get_reply( 
      prompt => 'URL to download',
      default => 'end' );
  $q->enqueue($url);
}
say "Finishing remaining downloads";
$q->enqueue(undef);
$thr->join();

2 个答案:

答案 0 :(得分:2)

say在输出中添加换行符;请改用print。添加回车符以覆盖上一个输出:

print "Downloading: ".$item."\r";

答案 1 :(得分:2)

您尝试做的基本操作是使用 ANSI 代码移动光标。诸如 ncurses (Windows版本:http://gnuwin32.sourceforge.net/packages/ncurses.htm)之类的内容将允许您执行此操作。

或者,您可以使用原始ASCII / ANSI代码自行完成(如这两个链接所述)

或者最后你可以使用Perl模块 Win32 :: Console :: ANSI ,它可以帮助你做到这一点:http://metacpan.org/pod/Win32::Console::ANSI

由于这是一个perl问题,我建议您查看 Win32 :: Console :: ANSI