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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Небольшая головоломка с массивами 
:(
    Опции темы
nIkTo
Дата 15.4.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 Дано:
Элементы в массиве $array_1 могут повторятся, в $array_2 нет.
 Необходимо:
  • Удалить дубли из $array_1.
  • Удалить из $array_1 элементы которые содержат вхождение хотя бы одного элемента из $array_2.
  • Оставить в $array_1 только "верхние" катологи (например среди этих: ["./a", "./a/a", "./b/b", "./b", "./c"] верхними будут: ["./a", "./b", "./c"]).
  • Ну и наконец объединить $array_1 с $array_2.

Вот что получилось у меня, может есть решение проще ?
Код

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my $array_1 = ['./log/date',
               './myfolder/log/today',
               './log/archive/15.04',
               './log/archive/14.04',
               './log/archive',
               './log/archive',
               './log',
               './folder/test',
               './current',
               '.',
               './current',
               './backup/today',
               './settings'];

my $array_2 = ['./log',
               './today',
               './total',
               './current/log',
               './clear'];

# Удаляем дубли из $array_1
my %seen =();
$array_1 = [grep { ! $seen{$_}++ } @{$array_1}];
print Dumper($array_1);

# Удаляем из $array_1 элементы которые содержат вхождение хотябы одного элемента из $array_2
foreach my $a (@{$array_2}) {
  $array_1 = [grep { ! /^$a/ } @{$array_1}];
}
print Dumper($array_1);

# Оставляем только верхние катологи
my $min = 100;
my $temp = [];
foreach my $path (@{$array_1}) {
  if ($path eq '.') {
    $temp = [$path];
    last;
  }
  if (my $current = $path =~tr|/|/|) {
    if ($current < $min) {
      $temp = [$path];
      $min = $current;
    } elsif ($current == $min) {
      push(@{$temp}, $path);
    }
  }
}
$array_1 = $temp;
print Dumper($array_1);

# Объединяем $array_1 и $array_2
push(@{$array_2}, @{$array_1});
print Dumper($array_2);


Результат :
Цитата

$VAR1 = [
          './log/date',
          './myfolder/log/today',
          './log/archive/15.04',
          './log/archive/14.04',
          './log/archive',
          './log',
          './folder/test',
          './current',
          '.',
          './backup/today',
          './settings'
        ];
$VAR1 = [
          './myfolder/log/today',
          './folder/test',
          './current',
          '.',
          './backup/today',
          './settings'
        ];
$VAR1 = [
          '.'
        ];
$VAR1 = [
          './log',
          './today',
          './total',
          './current/log',
          './clear',
          '.'
        ];

PM   Вверх
nIkTo
Дата 15.4.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть идеи ?
PM   Вверх
NuINu
Дата 15.4.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно есть решение проще, но для начала вам надо найти хотябы хоть какое то правильное.
у вас тут три задачи, как минимум две первые решаются неправильно.
PM MAIL   Вверх
nIkTo
Дата 15.4.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



NuINu, решение которое привёл выше вполне рабочее и решает задачу, но как-то не красиво =)
уверен что можно решить проще и красивее ...
PM   Вверх
NuINu
Дата 15.4.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я может не правильно понял задачу, но принтдамп, говорит что задача решается не верно

1. надо убрать дубли что мы видим в дампе?
          './myfolder/log/today',
          './folder/test',
          './current',
          '.',
          './backup/today',
          './settings'

а где?
          './log/archive/15.04',
          './log/archive/14.04',
          './log/archive',


2 Оставить в $array_1 только "верхние" катологи (например среди этих: ["./a", "./a/a", "./b/b", "./b", "./c"] верхними будут: ["./a", "./b", "./c"]).

что мы видим?
$VAR1 = [
          '.'
        ];

а где все остальное?
          './log',
          './current',
          './settings'

PM MAIL   Вверх
nIkTo
Дата 15.4.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



NuINu,  вы неправильно соотнесли принт дампа с решением подзадачи, вношу ясность :

1. Удалить дубли из $array_1
до
Цитата

my $array_1 = ['./log/date',
               './myfolder/log/today',
               './log/archive/15.04',
               './log/archive/14.04',
               './log/archive',
               './log/archive',
               './log',
               './folder/test',
               './current',
               '.',
               './current',
               './backup/today',
               './settings'];

после
Цитата

$VAR1 = [
          './log/date',
          './myfolder/log/today',
          './log/archive/15.04',
          './log/archive/14.04',
          './log/archive',
          './log',
          './folder/test',
          './current',
          '.',
          './backup/today',
          './settings'
        ];


2. Оставить в $array_1 только "верхние" катологи
до
Цитата

$VAR1 = [
          './myfolder/log/today',
          './folder/test',
          './current',
          '.',
          './backup/today',
          './settings'
        ];

после
Цитата

$VAR1 = [
          '.'
        ];


в моём понимании '.' выше чем './log', './current', './settings'  NuINu, вы так не считаете ?  smile 
PM   Вверх
NuINu
Дата 15.4.2010, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ааа сори, тогда ок )

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


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

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


 




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


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

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