Forum Webscript.Ru

Программирование => Perl => Тема начата: YYYn от 19 Марта 2003, 01:56:35

Название: Удаление повторов
Отправлено: YYYn от 19 Марта 2003, 01:56:35
Есть массивчик, а в нем имена файлов через пробел. Надо удалить повторяющиеся имена. :insane:

Заранее спасиб!
Название: Удаление повторов
Отправлено: Mog. от 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 от 19 Марта 2003, 10:46:57
Цитировать
Mog.:
не совсем понятно. Или массив или строка с именами файлов через пробел, а может список ?


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

Это имена файлов, к примеру.
Название: Удаление повторов
Отправлено: Chs от 19 Марта 2003, 11:00:46
perldoc -f split
Название: Удаление повторов
Отправлено: Mog. от 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 от 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 от 19 Марта 2003, 11:33:00
Цитировать
Chs:
perldoc -f split


А что именно сплитить?
Название: Удаление повторов
Отправлено: YYYn от 19 Марта 2003, 12:12:29
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.
Название: Удаление повторов
Отправлено: vladsu от 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 от 19 Марта 2003, 13:09:09
Цитировать
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.

Если массив, то смотри ответ Mog., второй в этом треде.
Название: Удаление повторов
Отправлено: YYYn от 20 Марта 2003, 00:32:38
Цитировать
Chs:
Если массив, то смотри ответ Mog., второй в этом треде.


Странно, но не пашет :(
Название: Удаление повторов
Отправлено: vladsu от 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
Название: Удаление повторов
Отправлено: YYYn от 20 Марта 2003, 11:00:03
Цитировать
vladsu:
А чем Вас мой вариант не устраивает?

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

Еще раз ВСЕМ спасибо за помощь! Все варианты хорошие!
Я, просто, не знаю как разобрать этот массив по пробелам.
Вариант @a = qw(@a); мне подошел бы, но так нельзя :(
Название: Удаление повторов
Отправлено: mike от 20 Марта 2003, 11:35:37
Цитировать
YYYn:
что имена файлов в массив у меня собираются из нескольких директорий (opendir и т.д.) автоматически и я их не сам не задаю. Я не знаю как применить qw к этому массиву (и можно ли вообще)

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

P.S. Оператор qw разбивает исходную _строку_ по пробелам и возвращает массив значений.
Название: Удаление повторов
Отправлено: vladsu от 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 замените на имя Вашего списка(массива) в любом из предложенных примеров!!!

Удачи!
Название: Удаление повторов
Отправлено: arto от 20 Марта 2003, 22:30:09
map { $a{$_}=1; } @a;
keys %a;
Название: Удаление повторов
Отправлено: Mog. от 21 Марта 2003, 16:21:05
И чтобы не пугать людей хэшами

map { $a{$_}=1 } @a;
@a=sort keys %a;

был @a несортированный массив с повторами, стал сортированный и без повторов.
Название: Удаление повторов
Отправлено: YYYn от 21 Марта 2003, 19:11:17
ВСЕМ ОГРОМНОЕ СПАСИБО!!!