Perl noob,未定义的子例程?

Perl noob,未定义的子例程?,perl,Perl,我正在制作一个简单的perl脚本,用于检查url是否打开,您可以通过txt文件检查网站。所以我的文本文件是list.txt,在它包含的第一行。这是一个非常简单的脚本,但当我试图运行它时,它会给我这个错误未定义的子例程&main::在test.pl第7行调用head。 这是脚本的代码 #!/usr/bin/perl use LWP::UserAgent; system(($^O eq 'MSWin32') ? 'cls' :'clear'); head(); my $usage = " \

我正在制作一个简单的perl脚本,用于检查url是否打开,您可以通过txt文件检查网站。所以我的文本文件是list.txt,在它包含的第一行。这是一个非常简单的脚本,但当我试图运行它时,它会给我这个错误<代码>未定义的子例程&main::在test.pl第7行调用head。 这是脚本的代码

#!/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"; } }
#/usr/bin/perl
使用LWP::UserAgent;
系统($^O eq'MSWin32')?'cls':'clear');
头();
my$usage=“\nperl$0\n perl$0 lista.txt”;
除非$ARGV[0],否则为“$usage”;
打开(目标“$target\n”;
my$ua=LWP::UserAgent->new(ssl\u opts=>{verify\u hostname=>0});
$ua->超时(10);
$ua->agent(“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.31(KHTML,类似Gecko)Chrome/26.0.1410.63 Safari/537.31”);
my$req=$ua->get($target/$path”);
如果($req->is\u成功){
打印“\n[!]Yay网站工作!\n\n”}

如何使此脚本工作?

此错误具体表示您在第7行调用了一个名为
head
的函数。 但它并不存在

也没有人知道它应该做什么。事实上,你已经把它放在那里了,这意味着你从某个地方复制了你的代码——问问他们

不过,我将提供一条建议-始终在代码开头启用
使用严格;
使用警告;

这段代码看起来有点像是在尝试运行URL列表并测试它们是否可检索。但它所做的一些事情在最好的情况下是糟糕的(在最坏的情况下也不会起作用):

  • 没有严格的警告

  • open
    实际上应该是
    open(我的$target_列表),一个短期修复方法似乎是删除对未定义的
    head()
    子例程的调用。它似乎没有做任何有用的事情,而且(正如您没有定义的那样)它正在导致您的程序死亡


    从长远来看,您可能应该找出调用的原因,并定义正确的子例程。

    您正在调用一个函数,
    head
    ,但尚未提供该函数的定义。您希望发生什么?什么是
    head()在Perl,和任何语言一样,在测试之前最多应该写两行或三行,只有当你知道你有一个坚实的基础时,才能写更多的代码。
    
    #!/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);