Автор Тема: Удаление повторов  (Прочитано 7827 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« : 19 Марта 2003, 01:56:35 »
Есть массивчик, а в нем имена файлов через пробел. Надо удалить повторяющиеся имена. :insane:

Заранее спасиб!

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Удаление повторов
« Ответ #1 : 19 Марта 2003, 08:40:27 »
Цитировать
YYYn:
Есть массивчик, а в нем имена файлов через пробел
не совсем понятно. Или массив  или строка с именами файлов через пробел, а может список ?

Если @dat - это массив с именами

for $x(@dat){
	
for 
$y(@u){
	
   if(
$x){
	
	
if(
$x=~/$y/i){$flag=1}
	
	
	
     }
	
	
  
	
	
}
	
if (!
$flag){push @u$x}
	
$flag=0;
}

в массиве @u получаем список неповторяющихся имен
Все болезни от нервов, только сифилис от удовольствия

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #2 : 19 Марта 2003, 10:46:57 »
Цитировать
Mog.:
не совсем понятно. Или массив или строка с именами файлов через пробел, а может список ?


000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm

Это имена файлов, к примеру.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Удаление повторов
« Ответ #3 : 19 Марта 2003, 11:00:46 »
perldoc -f split
2B OR NOT 2B = FF

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Удаление повторов
« Ответ #4 : 19 Марта 2003, 11:16:50 »
Они у тебя на бумажке написаны? Или как? Ты их откуда берешь?
Если
$a="000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm";
то

$b
=" ";# разделитель имен
@dat=split/$b/, $a;

и смотри выше
Все болезни от нервов, только сифилис от удовольствия

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #5 : 19 Марта 2003, 11:21:03 »
Проще использовать хеш.

$str = \'000219.mmm 000219.mmm 000220.mmm 000220.mmm\';
%h= ();
foreach(split /\\s+/, $str)
{
   $h{$_}++;
}
@files = sort keys %h;
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #6 : 19 Марта 2003, 11:33:00 »
Цитировать
Chs:
perldoc -f split


А что именно сплитить?

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #7 : 19 Марта 2003, 12:12:29 »
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Удаление повторов
« Ответ #8 : 19 Марта 2003, 12:24:13 »
Строка

use strict;
my $v = \'000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm\';
print $v = join " ", grep { $_{$_}++ == 0 and $_ } split / /,$v;

Список

use strict;
my @a = qw(000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm);
print join " ", grep { $_{$_}++ == 0 and $_ } @a;
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Удаление повторов
« Ответ #9 : 19 Марта 2003, 13:09:09 »
Цитировать
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.

Если массив, то смотри ответ Mog., второй в этом треде.
2B OR NOT 2B = FF

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #10 : 20 Марта 2003, 00:32:38 »
Цитировать
Chs:
Если массив, то смотри ответ Mog., второй в этом треде.


Странно, но не пашет :(

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Удаление повторов
« Ответ #11 : 20 Марта 2003, 00:45:42 »
А чем Вас мой вариант не устраивает?


use strict;
my @a = qw(000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm);
my @u;
push @u, grep { $_{$_}++ == 0 and $_ } @a;
print "@u";


Вариант Mog., рабочий, только мне он не нравится обилием циклов, проверок и переменных :(

@a = qw(000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm);

for $x(@a){
    for $y(@u){
       if($x){
          $flag=1 if($x=~/$y/i);
       }
    }
    push @u, $x if (!$flag);
    $flag=0;
}

print "@u";


А самый простой вариант mike
« Последнее редактирование: 20 Марта 2003, 01:19:06 от vladsu »
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн YYYn

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 38
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #12 : 20 Марта 2003, 11:00:03 »
Цитировать
vladsu:
А чем Вас мой вариант не устраивает?

И все другие, тем, что имена файлов в массив у меня собираются из нескольких директорий (opendir и т.д.) автоматически и я их не сам не задаю. Я не знаю как применить qw к этому массиву (и можно ли вообще). Split, тоже к массиву не прикрутить. :( А очень жаль...

Еще раз ВСЕМ спасибо за помощь! Все варианты хорошие!
Я, просто, не знаю как разобрать этот массив по пробелам.
Вариант @a = qw(@a); мне подошел бы, но так нельзя :(

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Удаление повторов
« Ответ #13 : 20 Марта 2003, 11:35:37 »
Цитировать
YYYn:
что имена файлов в массив у меня собираются из нескольких директорий (opendir и т.д.) автоматически и я их не сам не задаю. Я не знаю как применить qw к этому массиву (и можно ли вообще)

Если уже есть готовый массив имен файлов, тогда подходит любой вариант, где исходным набором данных является массив. Причем здесь разбор по пробелам?

P.S. Оператор qw разбивает исходную _строку_ по пробелам и возвращает массив значений.
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Удаление повторов
« Ответ #14 : 20 Марта 2003, 11:59:57 »
Мда...

уберите эту строку вообще: my @a = qw(000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm);

а далее где встречается @a замените на имя Вашего списка(массива) в любом из предложенных примеров!!!

Удачи!
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28