Perl-mechanize сталкивается с ограничениями - началось несколько попыток отладки - PullRequest
0 голосов
/ 11 марта 2012

Здравствуйте, дорогие разработчики.

прежде всего - извините за то, что я новичок .. я довольно новичок в 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);
}

ну что ты думаешь?

как бы тыизмените код - и убедитесь, что скрипт успешно запустится ...

1 Ответ

1 голос
/ 11 марта 2012

Во-первых, ваш ввод содержит косые черты, а затем вы пытаетесь использовать этот ввод для создания имени файла. Поскольку ваш ввод начинается с "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': $!";

вы, наверное, сами бы поняли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...