【问题标题】:Having HASH reference issue with perlperl 有 HASH 参考问题
【发布时间】:2017-01-25 20:15:04
【问题描述】:

出现以下错误:

名称“main::s”只使用了一次:第 22 行可能有错别字。

第 5 行不是 HASH 引用。

sub addtwo {

    my $params = shift;

    my $s = $params->{structure};

    if ( ref( $s ) eq "LIST" ) {

        $c = 0;

        foreach $e ( @{$s} ) {
            $s->[$c] = addtwo( { structures => $e } );
            $c++;
        }
    }
    elsif ( ref( $s ) eq "HASH" ) {

        if ( scalar keys %{$s} == 0 ) {
            return undef;
        }
        else {
            foreach my $e ( values %{$s} ) {
                $s{$e} = addtwo( { structure => $s->{$e} } );
            }
        }
    }
    else {
        $s = 1;
    }

    return $c;
}

print addtwo(
    [
        { a => 1, b => 2, c => 3 },
        { d => 4, e => 5 },
        [ 6, 7, 8 ],
        9,
        10,
        11,
        [ 12, 13, 14 ]
    ]
);

【问题讨论】:

  • 第三个错误(您还没有遇到):第 11 行您正在传递一个带有 structures 键的结构,而不是 structure
  • 错误:ref($s) eq "LIST" 应该是 ref($s) eq "ARRAY"
  • 提示:$s->[$c] = addtwo({ structures => $e }); 应该是 push @$s, addtwo({ structures => $e });
  • @user3047080:我认为你一次写的太多了。编写程序通常分小步进行:您应该输入几行代码并运行您的程序,以确保它可以编译和运行。然后你有一些东西可以建立。金字塔不是通过将数百万块石块放在适当的位置然后逃跑,手指交叉而建造的。

标签: list perl hash


【解决方案1】:

use strictuse warnings 'all' 添加到您编写的每个 Perl 程序的顶部。它不是初学者的安全网:它对于任何专业编程都是必不可少的

除了%s,您还没有声明$c$e,而且使用my 没有任何意义,除非您至少有use strict 有效

提供一个“解决方案”就是重写你已经写下的大部分内容,所以我认为你最好实施迄今为止给你的建议

但请尝试,正如我在评论中所写,一次编写程序的一小部分,并确保在您想要添加更多功能时有坚实的基础

【讨论】:

  • 您能详细说明一下吗?
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 2014-10-03
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多