【问题标题】:How do I access a value of a nested Perl hash?如何访问嵌套 Perl 哈希的值?
【发布时间】:2011-02-14 11:29:32
【问题描述】:

我是 Perl 新手,遇到一个非常简单的问题,但在查阅我的 Perl 书籍时找不到答案。

打印结果时

Dumper($request);

我得到以下结果:

$VAR1 = bless( {
             '_protocol' => 'HTTP/1.1',
             '_content' => '',
             '_uri' => bless( do{\(my $o = 'http://myawesomeserver.org:8081/counter/')}, 'URI::http' ),
             '_headers' => bless( {
                                    'user-agent' => 'Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.4) Gecko/20080528 Epiphany/2.22 Firefox/3.0',
                                    'connection' => 'keep-alive',
                                    'cache-control' => 'max-age=0',
                                    'keep-alive' => '300',
                                    'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                                    'accept-language' => 'en-us,en;q=0.5',
                                    'accept-encoding' => 'gzip,deflate',
                                    'host' => 'localhost:8081',
                                    'accept-charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'
                                  }, 'HTTP::Headers' ),
             '_method' => 'GET',
             '_handle' => bless( \*Symbol::GEN0, 'FileHandle' )
           }, 'HTTP::Server::Simple::Dispatched::Request' );

如何访问 '_method' ('GET') 或 'host' ('localhost:8081') 的值。

我知道这是一个简单的问题,但 Perl 一开始有点神秘。

【问题讨论】:

  • 如果你不确定如何使用一个对象,你应该阅读你正在使用的对象的文档before阅读Data::Dumper。请注意 Axeman 的回答。

标签: perl hash perl-data-structures


【解决方案1】:

Narthring 就 brute force 方法而言是正确的。嵌套哈希是通过像这样链接键来解决的:

$hash{top_key}{next_key}{another_key}; # for %hash
# OR
$hash_ref->{top_key}{next_key}{another_key}; # for refs.

但是,由于这两个“哈希”都是 祝福 对象。它可能有助于阅读HTTP::Server::Simple::Dispatched::Request,它可以告诉您它是一个HTTP::Request 对象,并查看headermethod 方法上的HTTP::Request 部分,告诉您以下方法可以解决问题:

my $method = $request->method();
my $host   = $request->header( 'host' );

真的,我建议您获取 firefox search plugin called Perldoc Module::Name,当您遇到 Dumper 输出显示“bless ... 'Some::Module::Name'”时,您可以将其复制并粘贴到搜索插件中并阅读CPAN 上的文档。

【讨论】:

  • +1。我经常希望禁止初学者 Perl 程序员使用 Data::Dumper,因为它打开了每个对象以供窥探,并且更容易进入对象并从散列而不是 中获取所需的值阅读文档 并使用正确的访问器方法。在下一个版本中字段表示发生变化时你会怎么做?这是一个 Perl 约定,私有值以下划线开头并且永远不能直接访问
  • Data::Dumper 非常有用,但对初学者来说尤其宝贵。
  • @Pedro Silva:我同意。这真的是一个权衡。我见过一些编码员撞墙。 如果他们能看到 DBI 调用返回的内容就好了。我向 DD 展示的那个人非常感激,这极大地加快了他的项目。这绝对比在黑暗的房间里感觉要好。自从找到 Smart::Comments 以来,我一直向其他开发人员推荐它,作为一种能够轻松查看代码实际执行情况的方法。但是,显示应该是“对象”的骨骼也有其缺点。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2015-04-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多