【问题标题】:Initializing hash reference in perl在 perl 中初始化哈希引用
【发布时间】:2013-09-08 17:38:34
【问题描述】:

下面的 Perl 代码打印出Value:0。除了在哈希引用传递给子例程之前向哈希添加一个虚拟键之外,还有其他方法可以解决它吗?

#!/usr/bin/perl 
use warnings;
use strict;

my $Hash;

#$Hash->{Key1} = 1234;

Init($Hash);

printf("Value:%d\n",$Hash->{Key});

sub Init
{
    my ($Hash) = @_;
    $Hash->{Key}=10;
}

【问题讨论】:

    标签: perl hash reference


    【解决方案1】:

    初始化一个空的哈希引用。

    #!/usr/bin/perl 
    use warnings;
    use strict;
    
    my $Hash = {};
    
    Init($Hash);
    
    printf("Value:%d\n",$Hash->{Key});
    
    sub Init
    {
        my ($Hash) = @_;
        $Hash->{Key}=10;
    }
    

    【讨论】:

    • 如果你解释了为什么他的原始程序不起作用,我会投赞成票的。
    • 感谢您的反馈。对此很新,所以我会记住它以备将来使用。
    【解决方案2】:

    我知道答案已经被接受,但我认为值得解释为什么程序首先会这样做。

    直到 Init 函数 ($Hash->{Key}=10) 的第二行才创建哈希,该函数自动创建哈希并将引用存储在 $Hash 标量中。这个标量是函数的局部变量,与脚本主体中的$Hash 变量无关。

    这可以通过修改Init 函数处理其参数的方式来改变:

    sub Init {
        my $Hash = $_[0] = {};
        $Hash->{'Key'} = 10;
    }
    

    【讨论】:

    • 如果哈希引用未初始化,传递给子程序的内容是什么?
    • @Jean 它只是发送一个未定义的标量。不是对任何东西的引用。
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多