0

我的脚本要求下载 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();
4

2 回答 2

2

say在输出中添加换行符;改为使用print。添加回车以覆盖先前的输出:

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

于 2014-04-25T12:12:13.120 回答
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

于 2014-04-25T13:30:02.027 回答