2012-03-14 77 views
2

我有点初学者perl我需要知道如何检查对象类的名称。perl中的对象类名称

我的代码是:

foreach my $y (keys %$x) { 
    print "$y\t$x->{$y}\n"; 
} 

与输出:

154176568  [object HTMLImageElement] 
146292140  [object HTMLDocument] 
153907016  [object HTMLImageElement] 

我需要打印只是按键是HTMLImageElement对象。

现在的问题是:

(1)我怎样才能检查类名

(2)我怎样才能得到 /打印类名

+1

测试代码是否按字面打印'[object HTMLImageElement]'?如果是这样,那么它看起来像对象有一个字符串化方法。如果是这种情况,你可以使用'“$ x - > {$ y}”eq'[object HTMLImageElement]'来测试字符串化的结果。同样,你可以通过强制字符串化来获得类名,例如'我的$ class_name =“$ x - > {$ y}”;' – zgpmax 2012-03-14 15:40:09

回答

2

看着the source for JE,它看起来像JE::Object::ProxyJE::Object子类,JE::Object有一个字串方法(use overload fallback => 1, ... '""' => 'to_string' ...)。

所以,当你做print "$y\t$x->{$y}\n";,这是打印字符串$x->{$y}的结果。

您可以通过将对象放在双引号中对其进行字符串化,所以"$x->{$y}"。这个表达将具有诸如你看到被打印的值,例如, '[object HTMLImageElement]'

如果你想拿起仅HTMLImageElement对象,那么你可以使用像

"$x->{$y}" eq '[object HTMLImageElement]' 

表达式如果你特别要提取字符串化值的字符串'HTMLImageElement'检查这些,你可以做使用正则表达式,例如

("$x->{$y}" =~ m{^\[object (.*)\]$}so)[0] 

不过,看着the source for JE::Object::ProxyJE::Object::Proxy有一个方法class可能也许返回的对象是一个代理类的名称。因此,您可以使用$x->{$y}->class获得课程名称,然后可以直接在$x->{$y}->class eq 'HTMLImageElement'中进行测试。

1

如果你想有一个字符串表示类名,使用ref($ object)。这将返回一个变量的引用类型,对于perl对象,这个变量最终成为祝福对象的包。

如果您想简单地检查变量是否是某个类的实例,请使用isa()方法。例如:

if ($obj->isa('Animal::Dog')) { 
    push @dogs, $obj; 
} 
+1

如果他的课程是从另一个课程扩展的话,这并不总是有效。看到我关于isa的回答() – Cfreak 2012-03-14 15:12:40

+0

我想我们都假设他想要'检查'的含义不同。我假设他从他的例子中想要看到它(通过打印),而你认为​​他正在尝试进行程序检查。 – gorjusborg 2012-03-14 15:18:15

+0

不起作用,因为'ref'为它们全部返回'JE :: Object :: Proxy'。 – 2012-03-14 15:24:32

4

在Perl中,所有类都神奇地扩展了UNIVERSAL包。它有一个叫做isa(),你可以用它来做到这一点的方法:

foreach my $y (keys %$x) { 
    if($x->{$y}->isa('HTMLImageElement')) { 
     print "$y\t$x->{$y}\n"; 
    } 
} 
+1

这是正确的方法,如果您试图检查它是否是某种类型,但不会允许您显示类的类型。 – gorjusborg 2012-03-14 15:14:20

+0

如何获得'$ x - > {$ y}'的类名?看起来'isa'只用于检查,对吗? – 2012-03-14 15:22:33

+0

它不起作用,并且它每次都返回'false'。如果我使用'isa('JE :: Object :: Proxy')',那么它每次都返回'true'。 :( – 2012-03-14 15:38:49