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