perl-mechanize遇到限制 – 开始几个debugging尝试

你好亲爱的开发者

首先 – 抱歉作为新手..我是相当新的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); } 

代码给出的是什么?

 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 

有这样的票价摆脱的问题:以及我可以使用诊断编译来获得更多的见解发生了什么…或者,打印()closures文件句柄OUTPUT也给了我们很多的答案,将告诉我们没有使用autodie,也没有检查open的返回值。

嗯 – 嗯,我只是沉迷于文件句柄

好吧:公开呼叫失败,并且由于您认为成功,并继续尝试使用文件句柄(未打开),您收到该错误。

这里要学习的一个教训是,我们应该总是检查一个公开呼叫的返回码,以validation它是否成功,如果不是,那么采取适当的行动。

好 – 我想我必须在这里学习一些perl问题…我想我必须相应地更正代码。

我们也应该小心,应该使用3 argforms的开放和一个词汇变种的文件句柄。

嗯,这个在这里呢? 码:

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

我只是可以build立这个部分到原来的代码.. whatcha认为?

 #!/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); } 

那么你觉得呢?

你将如何改变代码 – 并确保脚本将成功运行…

Solutions Collecting From Web of "perl-mechanize遇到限制 – 开始几个debugging尝试"

首先,您的输入包含斜线,然后您正在尝试使用该输入来创建文件名。 由于您的输入以“ http://www ”而不是“ www ”开头,您的替换操作也不会执行任何操作。

 my $name = "$_"; # eg $name <= "http://www.zug.phz.ch" $name =~s/^www\.//; # $name still is "http://www.zug.phz.ch" $name .= ".png"; # $name is ""http://img.zgserver.com/linux/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 

如果有的话,你想要检查的价值返回在你的while循环中的open呼叫。 如果你说过

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

你可能会想出你自己的。