Имя класса объекта в Perl - PullRequest
2 голосов
/ 14 марта 2012

Я новичок в perl , и мне нужно знать, как проверить имя класса объекта.

Мой код:

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

с выводом:

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

Мне нужно напечатать только ключи, которые являются HTMLImageElement объектами.

Теперь вопрос:

(1) Как я могу проверить имя класса

(2) Как мне получить / напечатать название класса

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

В Perl все классы магически расширяют пакет UNIVERSAL.У него есть метод с именем isa(), который вы можете использовать для этого:

 foreach my $y (keys %$x) {
   if( $x->{$y}->isa('HTMLImageElement') ) {
      print "$y\t$x->{$y}\n";
   }
 }
2 голосов
/ 14 марта 2012

Глядя на источник для JE , выглядит, что JE::Object::Proxy является подклассом JE::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]

THOUGH, глядя на источник для JE :: Object :: Proxy , JE::Object::Proxy имеет метод class, который может, возможно, вернуть имя класса, для которого объект является прокси.Таким образом, вы можете получить имя класса с помощью $x->{$y}->class, а затем проверить его напрямую, как в $x->{$y}->class eq 'HTMLImageElement'.

1 голос
/ 14 марта 2012

Если вы хотите строку, обозначающую имя класса, используйте ref ($ object).Это вернет ссылочный тип для переменной, которая для объектов perl окажется пакетом благословенного объекта.

Если вы хотите просто проверить, является ли переменная экземпляром определенного класса, используйтеметод isa ()Например:

if ($obj->isa('Animal::Dog')) {
   push @dogs, $obj;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...