0

$h下面是一个对象,但它只包含一个常规哈希。

my $h = YAML::Syck::LoadFile('have_seen.yaml');

如果它是一个普通的散列,那么键的数量就是keys $h.

问题

当哈希在对象中时如何获取键的数量?

更新

这是代码

#!/usr/bin/perl

use strict;
use YAML::Syck;

my $h = YAML::Syck::LoadFile('h.yaml');

my $links = 100;

print $links - keys $h . "\n";

yaml 文件包含

--- 
010711: 1
---
4

3 回答 3

6

$h不是一个对象,而是一个普通的 hashref。这实际上是一个运算符优先级问题。使用括号将参数绑定到keys函数紧密。

print $links - keys($h) . "\n";

正如 Greg Bacon 所指出的,在旧的 Perls 上,有必要首先使用%$hor手动取消引用%{ $h }(这是更好的样式)。

于 2012-06-02T22:11:29.880 回答
1

使用keys运算符,如

print scalar keys %$h;

大多数时候,显式scalar是不必要的,例如

my $n = keys %$h;

但深入研究对象的内部通常是个坏主意。请改用公共接口。你为什么要这样做?

于 2012-06-02T21:44:27.970 回答
0

我的代码也产生了同样的错误Type of argument to keys on reference must be unblessed hashref or arrayref,但不同之处在于哈希是从我自己的对象产生的。

sub getAttributes {
  my $self = shift;
  return $self->{ATTRIBUTES};
}

我尝试了几种方法来keys取消引用返回的内容,$instance->getAttributes()但似乎一旦得到祝福,键功能就不想知道了。

于 2013-05-04T18:28:26.097 回答