【问题标题】:Accessing global hash in a subroutine in Perl在 Perl 的子例程中访问全局哈希
【发布时间】:2012-10-16 02:55:08
【问题描述】:

我创建了一个全局哈希,当我尝试从 Perl 子例程中访问该哈希时,它无法访问它。

我已将其声明为:

`%HASH = ();`

并尝试在子例程中访问它:

$HASH{$key} = $value;

我做错了吗?

【问题讨论】:

  • 哈希值是在同一个文件的sub之前声明的吗?你有use strictuse warnings 吗?再贴一些代码
  • 显示一些相关的代码来证明你的问题。
  • 感谢大家的帮助。我正在使用: push (@{$HASH{$key}}, $value) 将哈希值推送到数组中,但没有对数组进行排序,因此找不到该值,在我看来它无法访问它。我的错,谢谢你的帮助:)
  • @iDev 你不是pushing “在一个数组中”,而是在一个(匿名)数组引用INSIDE你的哈希。请注意,如果它不存在,它将被创建。在您的哈希上查看Data::Dumper 的输出以了解更多信息。在perlreftut 中了解有关参考的更多信息。在几乎所有情况下,useing strictwarnings 都有助于找到错误的东西。 Learn more
  • 谢谢 memowe .. 内容丰富! :)

标签: perl hash global-variables subroutine


【解决方案1】:

在这里可以正常工作:

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

our %truth = (); # "global" truth: lexical name
                 # for the package variable %main::truth

sub add_to_truth {
    my ($thing, $value) = @_;
    $truth{$thing} = $value;
}

add_to_truth(answer => 42);
say $truth{answer};

输出

42

请注意,在strictures 下,您必须使用它们的包名称(在这种情况下为%main::truth)来完全限定“全局”变量,或者使用our 为它们创建一个词法范围的本地名称。今天没有限制(和警告)的编程是不是一件好事™。事实上,激活它们会告诉你一些有用的东西。

【讨论】:

  • 在这种情况下“我们的”是绝对必要的吗?我用“我的”试了一下,效果也很好。据我了解,当您想与整个包共享时使用“我们的”。
猜你喜欢
  • 2017-01-18
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2014-07-02
  • 2015-07-06
  • 2017-04-07
相关资源
最近更新 更多