如果$ h是一个对象,如何“键%h”?

时间:2012-06-02 21:42:20

标签: perl

$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
---

3 个答案:

答案 0 :(得分:6)

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

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

正如格雷格·培根指出的那样,在旧的Perls上,有必要先用%$h%{ $h }(这是更好的风格)手动取消引用。

答案 1 :(得分:1)

使用

中的keys运算符
print scalar keys %$h;

大多数情况下,明确的scalar是不必要的,例如

my $n = keys %$h;

但是进入一个对象的内部通常是一个坏主意。请改用公共界面。你为什么要这样做?

答案 2 :(得分: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()返回的内容,但似乎一旦它被祝福,键功能就不想知道了。