Perl для системного администрирования

       

Работа с объектами контейнер/коллекция



Работа с объектами контейнер/коллекция

Ранее в этом разделе уже упоминались два типа объектов ADSI: лист и контейнер. Объект-лист представляет собой только данные, тогда как контейнер (известный еще как коллекция - в терминах OLE/COM) содержит другие объекты. Еще одно отличие двух типов объектов в контексте ADSI состоит в том, что объект-лист не имеет дочерних объектов в иерархии, а у контейнеров такие объекты есть.

Объекты-контейнеры требуют специальной обработки, т. к. в большинстве случаев нас интересуют данные, инкапсулированные их дочерними объектами. Существует два способа обратиться к таким объектам из Perl. Win32: :OLE имеет специальную функцию под названием in(), которая недоступна по умолчанию, если модуль загружается стандартным способом. Если необходимо получить к ней доступ, надо в начале программы использовать следующее:

use Win32::OLE 'in';

in() возвращает список ссылок на дочерние объекты, хранящиеся в этом контейнере. Это позволяет писать легко читаемые программы на Perl:

foreacn Schiid (in $adsobj){

print $child->!Name}

Другой путь заключается в том, чтобы загрузить один из полезных потомков

Win32: :OLF под названием Win32: :OLE: :Enum. Win32: :0! F.' : f.-",:'1 ->new()

создает объект-перечислитель из какого-либо объекта-контейнера:

use Win32 : : OLE: : Enuti:

$onobj = Win32: :OLE: : Enurr->new($adsobj);

Для этого объекта можно вызвать несколько методов и получить дочерние объекты $adscoj. Подобный подход должен напомнить вам способ, применяемый в операциях поиска с Moziila: : LOAP; процесс тот же самый.

Идентификация объекта-контейнера

Заранее нельзя узнать, является ли объект контейнером. Не существует способа из Perl «спросить» объект, не контейнер ли он. Максимум, что можно сделать, - попытаться создать объект-перечислитель и, если эта попытка не удастся, фиксировать данный результат. Вот короткий пример, который делает именно это:

use Win32::OLE;

use Win32::OLE::Enum:

eval {$enobj = Win32::OLE::Enum->new($adsobj)};

print "Объект " . ($@ ? "не " : "") . "является контейнером \п";

Второй способ - посмотреть на другие источники, описывающие этот объект. Все это плавно перетекает в третью сложность.



Содержание раздела