#!perl use strict; use warnings; my %persons; # Считываем строку из блока __DATA__ foreach my $str (<DATA>) { chomp $str; # Делим строку на босса и подчинённого my ($boss, $slave) = split(/ => /, $str); # Проверяем, определён ли массив боссов для подчинённого if (defined($persons{$slave}{'boss'}[0])) { # Если определён, то добавляем в конец массива босса push($persons{$slave}{'boss'}, $boss); } else { # Если не определён, то определяем массив, присваивая первое значение $persons{$slave}{'boss'}[0] = $boss; } # Проверяем, определён ли массив подчинённых для босса if (defined($persons{$boss}{'slave'}[0])) { # Если определён, то добавляем в конец массива подчинённого push($persons{$boss}{'slave'}, $slave); } else { # Если не определён, то определяем массив, присваивая первое значение $persons{$boss}{'slave'}[0] = $slave; } } # Печатаем всех боссов, которые не имеют боссов foreach my $boss_without_boss (sort(keys(%persons))) { unless (defined($persons{$boss_without_boss}{'boss'}[0])) { print "$boss_without_boss\n"; my $level = 0; # Вызываем подпрограмму печати всех подчинённых print_all_slaves($boss_without_boss, $level); } } # Подпрограмма печати всех подчинённых sub print_all_slaves { my ($boss, $level) = @_; $level++; # Перебираем весь массив подчинённых foreach my $name (@{$persons{$boss}{'slave'}}) { # Печатаем подчинённого print '-' x $level; print "$name\n"; # Рекурсивно вызываем подпрограмму печати всех подчинённых print_all_slaves($name, $level); } } __DATA__ MihailVYa => AlexeyMSh ValeriEG => IrinaAB NinaPM => NataliVE EugeneAL => IgorGT IgorGT => VladimirAD MihailVYa => VadimMA IgorGT => IrinaUF IgorGT => LubovNI IgorGT => SergePO IgorGT => AlexPA NinaPM => TatianaAR NinaPM => IrinaAM NinaPM => ElenaNM NinaPM => GalinaAK MihailVYa => NinaPM NinaPM => IrinaNB EugeneMM => romanma |