0

我有一个 perl 脚本,可以从远程服务器获取一些文件,我希望能够代表进度。我尝试这样做的方式是这样的:

    print "\tDownloading comp.reg.binary.sdiff.log...\n";
    if(does_file_exist('comp.reg.binary.sdiff.log', @ret)){
        $sftp->get("t-gds/log/comp.reg.binary.sdiff.log", $saveDir, sub {
            my($sftp, $data, $offset, $size) = @_;
            print "\tRead $offset of $size bytes\r";
        });
        print "\n\tDownloaded.\n";
    }else{
        print "\tFile not found on server...skipping.\n";
    }

但是,cygwin 似乎吞下了回车,直到最后一个 print 语句才打印任何内容。我对此表示怀疑,因为脚本运行得太快了,因为当我将 \r 更改为 \n 时,我可以看到它们打印出来很慢。

有谁知道为什么它没有按应有的方式工作?

4

3 回答 3

2

你记得先设置$|为 1 吗?听起来不像。

于 2011-08-16T19:44:11.750 回答
1

您的输出可能是行缓冲的。尝试添加$| = 1;到脚本的顶部。如果这可行,有办法进行更多的查找粒度控制。

于 2011-08-16T19:45:32.743 回答
0

你用的是哪个终端?如果不是 cygwin 提供的 pty(例如 cygwin 附带的 rxvt)而是 Windows 控制台,则 perl 可能无法检测到它正在写入终端,因此默认在内部缓冲输出直到它可以写入一个大块。

用于$| = 1;显式抑制此缓冲。

于 2011-08-16T19:47:45.287 回答