【问题标题】:Perl subroutine doesn't return valuePerl 子例程不返回值
【发布时间】:2015-04-16 16:46:25
【问题描述】:

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

【问题讨论】:

  • $str 在ref $node == true 部分没有改变。
  • 您永远不会在 if 语句的 true 部分设置 $str 的值。
  • 你确定不想要$node->as_text吗?
  • 谢谢大家,现在我明白了
  • @Borodin,我不知道这可能...... :) 所以,一切都更简单了吗?)

标签: perl function return-value subroutine


【解决方案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";
    }
}

【讨论】:

    【解决方案2】:

    您忘记在if 的“then”部分添加到$str

    parseHTML ($child_node, $depth + 1);
    

    应该是

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

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多