perl-mechanize遇到限制 - 开始了几次调试尝试

时间:2012-03-11 16:54:41

标签: linux perl debugging printf mechanize

亲爱的开发人员,你好。

首先 - 抱歉是新手..我对Perl很新。

我正在尝试学习一些关于perl的知识,同时玩代码 - 和片段。 今天我有一个运行机械化工作的小脚本..但有些不会运行到最后。 Waht的目标是:我想获得一些wesite-sceenshots的缩略图。

好吧,我运行这个脚本,这是为了做一些我已经运行并运行mozrepl的网站的截图。什么是奇怪的输出 - 见下文...问题:我应该更改脚本为什么我输出?

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s/^www\.//;
        $name .= ".png";
        open(OUTPUT, ">$name");
        print OUTPUT $png;
        sleep (5);
}

代码给badck的是

http://www.unifr.ch/sfm
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 2.
http://www.zug.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 3.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 4.
http://www.luzern.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 5.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 6.
http://www.phvs.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 7.
http://www.phtg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 8.
http://www.phsg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 9.
http://www.phsh.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 10.
http://www.phr.ch

为了摆脱这些问题所做的事情: 好吧,我可以使用diagnostics-pragma来更深入地了解正在发生的事情...... 或者,关闭文件句柄OUTPUT上的print()也为我们提供了许多答案 会告诉我们,我们没有使用autodie,也没有检查open的返回值。

嗯 - 好吧,我只是沉迷于文件句柄

嗯:打开调用失败,因为您认为它已成功并继续尝试使用文件句柄(未打开),您收到了该错误。

这里要吸取的教训是,我们应该始终检查公开呼叫的返回代码以验证它是否成功,如果不成功则采取适当的措施。

嗯 - 我想我必须在这里学习一些perl-issues ...我想我必须相应地更正代码。

我们也应该注意并且应该使用3 arg形式的open和lexical var作为文件句柄。

嗯,这个怎么样? 代码:

open my $out_fh, '>', $name or die "failed to create/open '$name' <$!>";

我只是可以将这部分构建到原始代码中..想想什么?

#!/usr/bin/perl




use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open my $out_fh, '>', $name or die "failed to create/open '$name' <$!>";


open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s/^www\.//;
        $name .= ".png";
        open(OUTPUT, ">$name");
        print OUTPUT $png;
        sleep (5);
}

好  你觉得怎么样?

如何更改代码 - 并确保脚本能够成功运行...

1 个答案:

答案 0 :(得分:1)

首先,您的输入包含斜杠,然后您尝试使用该输入来创建文件名。由于您的输入以“http://www”而非“www”开头,因此您的替换操作也无效。

my $name = "$_";            # e.g. $name <= "http://www.zug.phz.ch"
$name =~s/^www\.//;         # $name still is "http://www.zug.phz.ch"
$name .= ".png";            # $name is ""http://www.zug.phz.ch.png"
open(OUTPUT, ">$name");     # error: no directory named "./http:"
print OUTPUT $png;
sleep (5);

您希望更好地清理文件名。也许像是

$name =~ s![:/]+!-!g; #http://foo.com/bar.html  becomes  http-foo.com-bar.html

如果有的话,您要在open循环内的while调用中返回要返回的值。如果你说过

open(OUTPUT,">$name") or warn "Failed to open '$name': $!";

你可能会自己解决这个问题。