如何为Perl的File :: Fetch设置输出文件?

时间:2010-01-02 22:11:27

标签: perl

我在Perl脚本中使用File::Fetch。如何让File :: Fetch存储要在指定文件中下载的文件?

我试过了:

    use File::Fetch;
    my $ff = File::Fetch->new(uri => 'http://stackoverflow.com/users/63550');
    #my $where = $ff->fetch() or die $ff->error; # Creates a file named "63550".
    my $where = $ff->fetch(to => 'SO.html'); # Creates a subfolder named SO.html with a file named "63550" in it.

解决方法是在下载后重命名文件,但是是否可以立即指定文件名?

测试平台:

  • ActiveState Perl 64位。来自perl -v

    v5.10.0 built for MSWin32-x64-multi-thread
    Binary build 1004 [287188] provided by ActiveState.
    
  • Windows XP。

2 个答案:

答案 0 :(得分:2)

查看源代码,唯一的方法似乎是创建一个子类并覆盖output_file方法。我想作者会接受一个使output_file具有读/写属性的补丁,以便在运行时更改它。

答案 1 :(得分:1)

我查看了File::Fetch 0.22代码,看看你需要为此做些什么。有一个错误会阻止您进行子类化(除非您要覆盖new()create()来修复它)。 更新 File::Fetch开发人员已应用我的补丁,很快就会推出新版本。

最简单的事情可能是将文件提取到临时目录,使用output_file发现名称,并将rename发送到最终位置。

卢卡斯认为我错了,但我认为他并没有像我一样尝试过它。创建子类并覆盖output_file无效:

#!perl

use strict;
use warnings;

BEGIN {
package File::Fetch::MyOutput;
use parent qw(File::Fetch);

sub output_file { die "I was called!" }
}

my $ff = File::Fetch::MyOutput->new( 
     uri => 'http://search.cpan.org/~bingos/File-Fetch-0.22/lib/File/Fetch.pm' 
     );

$ff->fetch( to => '.' );

当我运行它时,我最终在当前目录中使用 Fetch.pm 。该脚本不会因为它从未调用我的output_file而死亡,因为该对象实际上并不在我的子类中。这是File::Fetch中的一个错误,我将其归档为RT 53427