首先 - 抱歉是新手..我对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);
}
好 你觉得怎么样?
如何更改代码 - 并确保脚本能够成功运行...
答案 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': $!";
你可能会自己解决这个问题。