Thursday, February 25, 2010

Как сделать unbless в Perl

В Perl объекты - это обычные ссылки, в которых кроме прочего содержится информация о пакете (классе), к которому данный "объект" принадлежит. Для создания объекта служит функция bless:

bless {}, MyPackage;


Иногда бывает необходимо получить собственно ссылку, без информации о пакете. Такая необходимость может возникнуть, например, при использовании шаблонизатора или сериализации объекта в YAML или JSON. Например, оператор '.' в Template Toolkit всегда сначала пробует использовать строку справа как метод, затем как ключ хэша, etc.

Конечно, в таких случаях можно просто скопировать данные в новую структуру, но это было бы не эффективно, особенно при работе с большими структурами данных. Намного эффективней выполнить действие, обратное bless.

К сожалению, функции unbless в самом языке нет. Зато она есть в модуле Data::Structure::Util:

use Data::Structure::Util 'unbless';
use Scalar::Util 'refaddr';

my $x = bless {}, 'MyPackage';
printf "%s: %sn", refaddr $x, ref $x;
unbless $x;
printf "%s: %sn", refaddr $x, ref $x;



160126928: MyPackage
160126928: HASH


Как видим, адрес переменной не изменился. А вот "тип" ссылки изменился с MyPackage на HASH.

1 comment:

  1. Не пробовал модуль, но иногда надо из объекта получить просто хэшреф, например для передачи в HTML::Template

    ReplyDelete