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


Создание системы учетных записей для работы с пользователями - часть 14


Вариант номер 3 кажется более разумным, так что последуем ему. Вот подпрограмма, которая принимает одну структуру данных (рис. 3.5), и преобразует ее в другую структуру данных (рис. 3.6). Объяснение примера будет приведено позже:

sub TransforuiForWrite{ my $queueref = shift;

my Stoplevel = scalar each %$queueref;

foreach my $user (keys %{$queueref->{$toplevel}}){

my %innerhash =map {$_, [$queueref->

{$toplevel}{$user}{$J] }

keys %<$queueref->{Stoplevel}{$user}};

$innerhash{'login'} = [$user];

push @outputarray, \%innerhash; }

Soutputref = { Stoplevei => \@outnui.array};

return $outputref:

}

Теперь подробно рассмотрим подпрограмму TrarsformForWate().

Если вы сравните две структуры (рис. 3.5, рис. 3.6), то заметите в них кое-что общее: это внешний хэш, ключом которого в обоих случаях является account. В следующей строке видно, как получить имя этого ключа, запрашивая первый ключ из хэша, на который указывает $que-ueref:

my Stoplevel = scalar each :6$i;eref:

Интересно взглянуть на закулисную сторону создания этой структуры данных:

my %innernabh =

mар {$_. [$queuer-ef-><$toplevel){$use'-}{$_ M 1

keys %{$queueref->{$toplevelf{$user}};

В этом отрывке кода мы используем функцию "iap(), чтобы обойти все ключи, найденные во внутреннем хэше для каждой записи (т. е. login, type, password и status). Ключи возвращаются в такой строке:

keys %{$queueref->{$toplevel}{$user}};

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

шар {$_, [$queueref->{$topleve]}{$user}{$_n }

Список, возвращаемый тар(), выглядит так:

(login,[bobf], type,[staff], password,[password]...)

Он имеет формат ключ-значение, где значения хранятся как элементы анонимного массива. Этот список можно присвоить хэшу %innerhash, чтобы заполнить внутреннюю хэш-таблицу для получаемой структуры данных (my %innerhash =). Кроме того, к хэшу следует добавить ключ login, соответствующий рассматриваемому пользователю:




- Начало -  - Назад -  - Вперед -



Книжный магазин