2012-03-14 48 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