程序无法识别Perl中的全局变量

时间:2015-02-08 11:58:43

标签: perl

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的新手,所以如果有人能告诉我什么是错的,我会很高兴。

1 个答案:

答案 0 :(得分:4)

您在致电$imge后将$LinkExtor->parse($URL)设置为空字符串。

请注意以下几点

  • 必须始终 use strictuse 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};
}