很抱歉打扰你这么愚蠢的问题,我是Perl的新手。
我正在尝试修改由我的同事编写的解析子例程,并且在perl中遇到函数问题。
它返回空值,我不明白为什么?已经阅读过参考网站,看过的例子很明显。这是功能代码:
sub parseHTML
{
my ($node, $depth) = @_;
my $str = ' ';
if (ref $node)
{
if ($node->tag () ne "script" && $node->tag () ne "style")
{
my @children = $node->content_list ();
for my $child_node (@children)
{
parseHTML ($child_node, $depth + 1);
}
}
}
else
{
$str = $str.$node."\n";
#print $str;
}
return $str;
}
然后我尝试使用它:
my $parser = HTML::TreeBuilder->new ();
$parser->parse ($cont);
my $Parsed = parseHTML ($parser, 0);
print "$Parsed\n";
#parseHTML ($parser, 0);
返回值为空。但是,如果我决定在功能中打印数据,请取消注释字符串:
print $str;
并使用parseHTML ($parser, 0);
代替它,它会起作用,并且有一个输出。
哪里可能是错误的?功能中的数据似乎是本地的
这也是complete code列表。
答案 0 :(得分:1)
你必须连接从parseHTML返回的$ str
$str .= parseHTML ($child_node, $depth + 1);
或者您可以这样使用指针:
...
my $Parsed;
parseHTML ($parser, 0,\$Parsed);
....
sub parseHTML
{
my ($node, $depth, $out) = @_;
my $str = ' ';
if (ref $node)
{
if ($node->tag() ne "script" && $node->tag() ne "style")
{
my @children = $node->content_list ();
for my $child_node (@children)
{
parseHTML ($child_node, $depth + 1,$out);
}
}
}
else
{
$$out .= $node."\n";
}
}
答案 1 :(得分:0)
您忘了在"然后"中添加$str
。 if
。
parseHTML ($child_node, $depth + 1);
应该是
$str .= parseHTML ($child_node, $depth + 1);