use LWP::Simple;
use HTML::LinkExtor;
$user = 'a***.***'; # Enter your username here
$pass = '***733 '; # Enter your password here
$home = "http://37.48.90.31";
$URL = get("$home/c/test.cgi?u=$user&p=$pass");
$LinkExtor = HTML::LinkExtor->new(\&links);
$LinkExtor->parse($URL);
$imge="";
sub links
{
($tag,%links)= @_;
if ($tag eq "img") {
foreach $key (keys %links) {
if ($key eq "src")
{
$imge = "$links{$key}\n";
}
}
}
}
print $imge;
它没有打印出什么原因?
根据我对Perl的理解,它应该知道$imge
,即使它在一个函数中。
我是Perl的新手,所以如果有人能告诉我什么是错的,我会很高兴。
答案 0 :(得分:4)
您在致电$imge
后将$LinkExtor->parse($URL)
设置为空字符串。
请注意以下几点
您必须始终 use strict
和use warnings
,并使用my
声明所有变量尽可能接近其第一个使用点
正确缩进代码,尤其是在寻求帮助时。它将帮助您在自己的程序中更好地查看结构,如果您寻求帮助,提供一些可读的内容是一件简单的礼貌
Perl变量名称应仅包含小写字母,数字或下划线。大写字母保留用于包名称等全局标识符
你错过了哈希的观点。没有必要搜索哈希的键 - 您可以直接访问哈希元素,就像访问数组元素一样,因此内部foreach
循环应该只是$imge = "$links{src}\n"
我假设您要打印每个<img>
元素src
atttribute,因此您应该将属性的值附加到$imge
。目前您只是在每次找到新值时替换值,因此只打印 last 值
这种重构应该对你有用,虽然我还没能测试它。
use strict;
use warnings;
use LWP::Simple;
use HTML::LinkExtor;
my $user = 'a***.***';
my $pass = '***733 ';
my $home = 'http://37.48.90.31';
my $url = get("$home/c/test.cgi?u=$user&p=$pass");
my $link_extor = HTML::LinkExtor->new(\&links);
my $imge;
$link_extor->parse($url);
print $imge;
sub links {
my ($tag, %links) = @_;
$imge .= "$links{src}\n" if $tag eq 'img' and exists $links{src};
}