Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структуры, Поиск пустых алементов в структуре данны 
V
    Опции темы
OutlawZ
Дата 27.6.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Приветствую, помогите решить небольшую проблему. 
Дана  структура:
Код

%struct = (
 OS => {
    Microsoft => ["Windows 3.11","Windows 95","Windows NT", "Windows XP", "Windows 7"],
    Linux      => ["Mandriva","Suse","Ubuntu","Kubuntu","DSL"],
    Apple      => ["Mac OS"],
 },
 MEMBERS => [
             { name => "Prosto Bill ",     company => "Microsoft", age => 45 },
             { name => "Linus Torvalds", company => "Linux",     age => 37 },
             { name => "James Morgan",   company => "LMUNION",   age => 22 },
            ],
);


Для поиска элементов которые не содержат не одного скаляра я понял что надо написать рекурсивную функцию, только одно но как ей передавать данные? Отдельно поиск я могу сделать но очень большой код может быть да и структуры разные могут быть.

Не понятно только одно как передавать параметры в функцию, просто может быть массив наполненный ссылками на три хеша как вот с этим работать? 
Буду признателен за ответ, просто намекните куда копать. 

Это сообщение отредактировал(а) OutlawZ - 27.6.2011, 23:25


--------------------
user posted image
user posted image
PM MAIL   Вверх
afiskon
Дата 28.6.2011, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: нет
Всего: 4



Ну берете хэш, перечисляете ключи, получаете ссылки на массивы, работаете с ними. В чем проблема то.

Это сообщение отредактировал(а) afiskon - 28.6.2011, 08:41
PM MAIL WWW   Вверх
Pfailed
Дата 28.6.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39





--------------------
PM MAIL   Вверх
OutlawZ
Дата 28.6.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



ок, все разобрался.


--------------------
user posted image
user posted image
PM MAIL   Вверх
OutlawZ
Дата 29.6.2011, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Извиняюсь что еще раз отвлекаю, как получать доступ к элементам структуры разобрался, но появились две проблемы 
Код

%struct = (
 OS => {
    Microsoft => ["Windows 3.11","Windows 95","Windows NT", "Windows XP", "Windows 7"],
    Linux      => ["Mandriva","Suse","Ubuntu","Kubuntu","DSL"],
    Apple      => ["Mac OS"],
       Members   => [
                  { name => "Bill Geths",     company => "Microsoft", age => 45 },
                  { name => "Linus Torvalds", company => "Linux",     age => 37 },
                  { name => " ",   company => unef,   age => 22 },
                 ],
 
 },
);


while (my ($key, $value) = each %struct) {
 find($value);
}

sub find {
 my ($value) = @_;
 my $ref = ref $value;
 
 if ( $ref eq 'HASH' ) {
    while ( ( $k, $v) = each %$value ) {
      find($v);
    }
 }elsif( $ref eq 'ARRAY' ) {
    for ( $i = 0; $i < @$value; $i++ ) {
     find($value->[$i]);
    } 
  }
}


Если перед вызовом рекурсий выводить значение то они выводятся без проблем, но используя пример выше приведенной ссылки где используется конструкция Data::Dumper пишет что вообще нечего не найдено 
Код

while (my ($key, $value) = each %struct) {
 if ( my $found = find($value) ) {
    print $found, ":\n", Dumper(eval "$found");
 }else{
    print "Not found\n";
 }
}

sub find {
 my ($value) = @_;
 my $ref = ref $value;
 
 if ( $ref eq 'HASH' ) {
    while ( ( $k, $v) = each %$value ) {
      if (my $hash = find($v) ) {
        return $hash;
      }
    }
 }elsif( $ref eq 'ARRAY' ) {
    for ( $i = 0; $i < @$value; $i++ ) {
      if ( my $array = find($value->[$i]) ) {
        return $array;
      }
    } 
  }
}

Выводит что нечего не найдено. Честно сказать я в тупике так как работал с структурами только два раза от силы. 
Удалял несколько элементов и искал пустые значение так и  тут проблемы, когда в структуре нет элемента он пишет что все в порядке. 
Помогите провести поиск ,найти пустые элементы и произвести удаление. уже 2 суток пытаюсь решить.

Это сообщение отредактировал(а) OutlawZ - 29.6.2011, 08:19


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 29.6.2011, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



OutlawZ, у вас в функции нет проверки на пустоту. Или чего вы ей хотите сделать?


--------------------
PM MAIL   Вверх
OutlawZ
Дата 29.6.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



Для проверки пустого значения я уже ставил но она не работает, скорее я где то ошибаюсь. но перепробовал все exitsts, defined , в т.е до вызова рекурсии была проверка есть ли значение в массиве или в ключе.

Я хочу просто проверить структуру на наличие пустых элементов,  и если таковые есть удалить. 


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 29.6.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Что в вашем понимании пустое значение?



--------------------
PM MAIL   Вверх
OutlawZ
Дата 29.6.2011, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

Репутация: нет
Всего: нет



в структуре то которое не содержит не одного скаляра

Это сообщение отредактировал(а) OutlawZ - 29.6.2011, 20:07


--------------------
user posted image
user posted image
PM MAIL   Вверх
Pfailed
Дата 29.6.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Получается пустой массив или хеш
Код

warn "empty array" unless @array;
warn "empty hash" unless %hash;




--------------------
PM MAIL   Вверх
Pfailed
Дата 30.6.2011, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Один и вариантов такой, кажется работает верно

Код

use strict;
use Data::Dumper;

my %struct = (
    TEST1 => { root => '/home', dir => {} },
    TEST2 => [ "0001", [1, {}, 3], "0003", "russian" ],
    TEST3 => { },
    TEST4 => [ { a => [ [ { c => {}, d => {}, e => [] } ] ] } ],
);

clean(\%struct);
print Dumper \%struct;

sub clean {
    my $struct = shift;
    my $ref = ref $struct;
    
    if ($ref eq 'HASH') {
        foreach my $key (keys %$struct) {
            clean($struct->{$key});
            
            my $subref = ref $struct->{$key};
            if (($subref eq 'HASH' and !%{$struct->{$key}}) ||
                ($subref eq 'ARRAY' and !@{$struct->{$key}})) {
                delete $struct->{$key};
            }
        }
    }
    elsif ($ref eq 'ARRAY') {
        for (my $i=0; $i<@$struct; $i++) {
            clean($struct->[$i]);
            
            my $subref = ref $struct->[$i];
            if (($subref eq 'HASH' and !%{$struct->[$i]}) ||
                ($subref eq 'ARRAY' and !@{$struct->[$i]})) {
                splice @$struct, $i, 1;
                $i--;
            }
        }
    }
}


Цитата

$VAR1 = {
          'TEST1' => {
                       'root' => '/home'
                     },
          'TEST2' => [
                       '0001',
                       [
                         1,
                         3
                       ],
                       '0003',
                       'russian'
                     ]
        };




--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.