Forum Webscript.Ru
Программирование => Perl => Тема начата: YYYn от 19 Марта 2003, 01:56:35
-
Есть массивчик, а в нем имена файлов через пробел. Надо удалить повторяющиеся имена. :insane:
Заранее спасиб!
-
YYYn:
Есть массивчик, а в нем имена файлов через пробел
не совсем понятно. Или массив или строка с именами файлов через пробел, а может список ?
Если @dat - это массив с именами
for $x(@dat){
for $y(@u){
if($x){
if($x=~/$y/i){$flag=1}
}
}
if (!$flag){push @u, $x}
$flag=0;
}
в массиве @u получаем список неповторяющихся имен
-
Mog.:
не совсем понятно. Или массив или строка с именами файлов через пробел, а может список ?
000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm
Это имена файлов, к примеру.
-
perldoc -f split
-
Они у тебя на бумажке написаны? Или как? Ты их откуда берешь?
Если
$a="000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm";
то
$b=" ";# разделитель имен
@dat=split/$b/, $a;
и смотри выше
-
Проще использовать хеш.
$str = \'000219.mmm 000219.mmm 000220.mmm 000220.mmm\';
%h= ();
foreach(split /\\s+/, $str)
{
$h{$_}++;
}
@files = sort keys %h;
-
Chs:
perldoc -f split
А что именно сплитить?
-
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.
-
Строка
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;
-
У меня именно массив, а не строка и не хеш. И выходные данные тоже необходимо заPushить в массив.
Если массив, то смотри ответ Mog., второй в этом треде.
-
Chs:
Если массив, то смотри ответ Mog., второй в этом треде.
Странно, но не пашет :(
-
А чем Вас мой вариант не устраивает?
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
-
vladsu:
А чем Вас мой вариант не устраивает?
И все другие, тем, что имена файлов в массив у меня собираются из нескольких директорий (opendir и т.д.) автоматически и я их не сам не задаю. Я не знаю как применить qw к этому массиву (и можно ли вообще). Split, тоже к массиву не прикрутить. :( А очень жаль...
Еще раз ВСЕМ спасибо за помощь! Все варианты хорошие!
Я, просто, не знаю как разобрать этот массив по пробелам.
Вариант @a = qw(@a); мне подошел бы, но так нельзя :(
-
YYYn:
что имена файлов в массив у меня собираются из нескольких директорий (opendir и т.д.) автоматически и я их не сам не задаю. Я не знаю как применить qw к этому массиву (и можно ли вообще)
Если уже есть готовый массив имен файлов, тогда подходит любой вариант, где исходным набором данных является массив. Причем здесь разбор по пробелам?
P.S. Оператор qw разбивает исходную _строку_ по пробелам и возвращает массив значений.
-
Мда...
уберите эту строку вообще: my @a = qw(000219.mmm 000219.mmm 000220.mmm 000220.mmm 000221.mmm 000221.mmm 000222.mmm 000222.mmm);
а далее где встречается @a замените на имя Вашего списка(массива) в любом из предложенных примеров!!!
Удачи!
-
map { $a{$_}=1; } @a;
keys %a;
-
И чтобы не пугать людей хэшами
map { $a{$_}=1 } @a;
@a=sort keys %a;
был @a несортированный массив с повторами, стал сортированный и без повторов.
-
ВСЕМ ОГРОМНОЕ СПАСИБО!!!