Здравствуйте, дорогие разработчики.
прежде всего - извините за то, что я новичок .. я довольно новичок в Perl.
Я пытаюсь что-то узнать о Perl, играя с кодом - и фрагментами.Сегодня у меня есть небольшой скрипт, который запускает работу по механизации ... но что-то не работает до конца.Вот цель: я хочу получить несколько миниатюр 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
Что я сделал так 101 * *, чтобы избавиться от проблем: ну, я могу использовать прагму диагностики, чтобы получить больше информации о том, что происходит ... В качестве альтернативы, print () на закрытом дескрипторе файла OUTPUT также даетМы получили много ответов, которые скажут нам, что мы не использовали autodie, а также не проверяли возвращаемое значение open.
хммм - ну, я просто размышлял о дескрипторе файла
хорошо: openвызов не удался, и, поскольку вы предположили, что он был успешным, и приступили к попытке использовать файловый дескриптор (который не был открыт), вы получили эту ошибку.
Урок, который необходимо усвоить, заключается в том, что мы ВСЕГДА должны проверять код возвратаоткрытый вызов, чтобы проверить, что это было успешно, и предпринять надлежащие действия, если это не так.
хорошо - я думаю, что мне нужно изучить здесь некоторые perl-проблемы ... Я думаю, что у меня естье исправить код соответственно.
мы также должны позаботиться и должны использовать 3 arg форму open и лексическую переменную для дескриптора файла.
хмм, как насчет этого здесь.Код:
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);
}
ну что ты думаешь?
как бы тыизмените код - и убедитесь, что скрипт успешно запустится ...