Perl子例程不返回值

时间:2014-08-13 12:30:11

标签: perl function return-value subroutine

很抱歉打扰你这么愚蠢的问题,我是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列表。

2 个答案:

答案 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)

您忘了在"然后"中添加$strif

的一部分
parseHTML ($child_node, $depth + 1);

应该是

$str .= parseHTML ($child_node, $depth + 1);