2015-02-19 4 views
-4

Я делаю простой Perl-скрипт, который проверяет, если url вверх, вы можете проверить веб-сайты через txt-файл. Поэтому мой текстовый файл - list.txt, а в первой строке он содержит https://google.com. Это довольно простой скрипт, но когда я пытаюсь запустить, он дает мне эту ошибку? Undefined subroutine &main::head called at test.pl line 7. И вот код сценария.Perl noob, undefined подпрограмма?

#!/usr/bin/perl 

use LWP::UserAgent; 

system(($^O eq 'MSWin32') ? 'cls' :'clear'); 

head(); 

my $usage = " \nperl $0 <list.txt>\n perl $0 lista.txt"; 
die "$usage" unless $ARGV[0]; 

open(tarrget,"<$ARGV[0]") or die "$!"; 
while(<tarrget>){ 
chomp($_); 
$target = $_; 

my $path = "/"; 

print "\nTarget --> $target\n"; 

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }); 
$ua->timeout(10); 
$ua->agent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like   Gecko) Chrome/26.0.1410.63 Safari/537.31"); 
my $req = $ua->get("$target/$path"); 
if($req->is_success) { 
print "\n [!] Yay website works! \n \n"; } } 

Как заставить этот скрипт работать?

+8

Вы вызываете функцию 'head', для которой вы не указали определение. Чего вы ожидаете? –

+0

Что должен делать 'head()'? Где это определено? – friedo

+2

Вы написали слишком много кода, не тестируя его. В Perl, как и на любом языке, вы должны написать максимум две или три строки перед тестированием и писать больше, когда знаете, что у вас есть прочный фундамент. – Borodin

ответ

2

Эта ошибка конкретно означает, что есть функция, называемая head, - которую вы вызываете в строке 7. И не существует.

Никто другой не может понять, что он должен делать. Тот факт, что у вас есть это, означает, что вы скопировали свой код откуда-то - спросите их.

Я предлагаю вам совет - ВСЕГДА включите use strict; и use warnings; в начале фрагмента кода.

Это довольно похоже на то, что этот код просто пытается запустить список URL-адресов и проверить, могут ли они быть восстановлены. Но он делает несколько вещей, которые в лучшем случае имеют плохой стиль (и просто не сработает в худшем случае):

  • Нет строгих/предупреждений.
  • open действительно должно быть open (my $target_list, "<", $ARGV[0]);.
  • У вас есть $path из /, который вы торчащий на конце $target, чтобы сделать $target//.
  • установить perltidy и использовать его для форматирования вашего кода. Поверьте мне, это облегчает жизнь в долгосрочной перспективе.
  • не создавайте новый useragent для каждой итерации цикла. Это избыточно.

С этими вещами в месте, ваш код может выглядеть немного так:

#!/usr/bin/perl 

use strict; 
use warnings; 

use LWP::UserAgent; 

my ($filename) = @ARGV; 

unless ($filename and -f $filename) { 
    print "Usage: $0 <filename>\n"; 
    exit; 
} 

my $useragent = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }); 
$useragent->timeout(10); 
$useragent->agent(
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31" 
); 

open(my $target_file, "<", $filename) or die $!; 
while (my $target = <$target_file>) { 
    chomp($target); 
    print "Fetching $target\n"; 
    my $request = $useragent->get("$target/"); 
    if ($request->is_success) { 
     print "\n [!] Yay website works! ($target)\n \n"; 
    } 
} 
close($target_file); 
0

кратковременная фикс, казалась бы, чтобы удалить вызов к неопределенной head() подпрограммы. Кажется, он ничего не делает полезным и (поскольку вы его не определили) это заставляет вашу программу умереть.

В долгосрочной перспективе вам, вероятно, следует выяснить, почему этот вызов существует и определить правильную подпрограмму.

Смежные вопросы