2015-02-08 75 views
-3
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中的全局变量

根据我对Perl的理解,即使它在函数中,它也应该知道$imge

我是Perl新手,所以如果有人能告诉我什么是错的,我会很高兴。

+6

请自己帮忙,至少使用'use strict',甚至更好'使用warnings'。这些可以帮助您更好地自行检测问题。适当的缩进也有帮助。另外,在调用LinkExtor后,您可以将'$ imge'设置为'“”“,这样您在打印变量之前删除'$ imge'中的任何内容。 – 2015-02-08 12:23:01

回答

4

在您拨打$LinkExtor->parse($URL)之后,您正在将$imge设置为空字符串。

请把这些要点记

  • 必须始终use strictuse warnings,并声明所有的变量与my尽可能接近要利用自己的第一点

  • 缩进你的代码正确,尤其是在寻求帮助时。这将帮助你看到在自己的程序结构更好,如果你寻求帮助

  • Perl的变量名应该只包含小写字母是礼貌的一个简单的问题提出一些半可读,数字或下划线。首都保留为全球标识符,如包名称

  • 您错过了散列点。有没有必要通过散列的键进行搜索 - 您可以直接以同样的方式访问一个哈希元素,你可以访问一个数组元素,让你内心foreach循环应该只是$imge = "$links{src}\n"

  • 我假设你要打印每<img> elemen't src atttribute,所以你应该追加该属性的值为$imge。既然这样你每次只需更换价值,你找到一个新的,所以只有最后值将被打印出来

这应该重构为你工作,但我一直没能测试它。

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}; 
}