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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование массива из 2-х с уник. значеними 
V
    Опции темы
meridian
Дата 14.9.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день!

Есть 2 масива

@array1 = qw(  a b c d i f );
@array2 = qw( b d f )

Как  сформировать третий массив @array3 из уникальных элементов массивов @array1 и @array2
(т.е. д. получиться масив из a, c b i )

у меня получается c 2-мя  foreach че то громоздко


Это сообщение отредактировал(а) meridian - 14.9.2006, 16:13
PM   Вверх
ZeeLax
Дата 14.9.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Если я тебя правильно понял, то тебе нужно что-то типа этого
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();
foreach my $item (@array1, @array2) {
    push (@array3, $item) unless $seen{$item}++
}

print join(",", @array3), "\n";

Выбирает уникальные элементы из соединения обоих массивов. Если что не так понял, извини.

Это сообщение отредактировал(а) ZeeLax - 14.9.2006, 16:57


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



meridian, ты что снова с тем вопрос мучиешься? smile
там были 100% уникальные, по крайне мере в последнем моём ответе smile
а так работа с хешем smile там ключи всегда уникальны smile как и код ZeeLax этот верен
Код

#!/usr/bin/perl -w
my @array1 = (1, 2, 3, 4, 5);
my @array2 = (6, 7, 3, 4, 1);
my %temp;
foreach (@array1, @array2) {
    $temp{$_} = 1;
}
my @array3 = sort keys %temp;



--------------------
PM   Вверх
ZeeLax
Дата 14.9.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



smile
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();

@array3 = grep { ! $seen{$_} ++ } (@array1, @array2);
print join(",", @array3), "\n";


Это сообщение отредактировал(а) ZeeLax - 14.9.2006, 17:44


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



ZeeLax, списывать надо верно ;) поправь свой код!
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();

@array3 = grep { ! $seen{$_} ++ } @list;
print join(",", @array3), "\n";

ты кукбука ;) @list в твоём скрипте нету

Добавлено @ 17:42 
а правим так:
Код

#!/usr/bin/perl -w
use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my %seen;
my @array3 = grep { ! $seen{$_} ++ } (@array1, @array2);
print "@array3";



--------------------
PM   Вверх
ZeeLax
Дата 14.9.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



nitr, сам ты такой smile я с консоли списывал smile


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



ZeeLax, нехорошо править код smile когда тебя поправить УСПЕЛИ!

meridian, купи CookBook или по-русски Сборник рецептов (Perl)


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


Опытный
**


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

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



Нуууу, насколько я понял человеку нужна разница массивов, а без двух foreach я пока не нашел решения...
В CookBook описано еще несколько, а мое вот такое:
Код

#!/usr/bin/perl -w
my @array1 = (1, 2, 3, 4, 5);
my @array2 = (6, 7, 3, 4, 1);
my %temp;

@{%temp}{@array1} = (0) x @array1;

foreach (@array2) {
    unless (exists $temp{$_}) {
        push(@array3, $_)
    } else {
     $temp{$_}++
    }

}
foreach (keys %temp) {
    push(@array3, $_) unless $temp{$_}
}

print "@array3";

1;



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 14.9.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



smile так я объединил массивы без дубликатов
я запутался smile
сорри... просто у него до этого такие же вопросы были smile)


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



вот... :
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);
my %temp;
foreach (@array1, @array2) {
    if (exists $temp{$_} && $temp{$_} == 0) {
        $temp{$_} = 1;
    } else {
    $temp{$_} = 0;
    }
}
foreach ( sort keys %temp ) {
    push @array3, $_ if $temp{$_} == 0;
}
print "@array3";

жуть, но зато исправился smile

Добавлено @ 18:57 
получаем a, c, i


--------------------
PM   Вверх
Nab
Дата 14.9.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вот таки решение с одним циклом... 
Но тут конечно идет добаление и удаление... что не совсем хорошо по производительности и дефрагментации памяти, но как вариант покатит smile

Код

my @array1 = qw(a b c d i f);
my @array2 = qw(b d f z);
my (%temp, %temp2);

foreach (@array1, @array2) {
    $temp{$_}++;
    if ( $temp{$_} > 1 ) {
        delete $temp2{$_} if exists $temp2{$_}
    } else {
     $temp2{$_}++
    }

}

print "@{[keys %temp2]}";



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 14.9.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Nab, 
а что надо было человеку? оптимально или с одним циклом ;)



--------------------
PM   Вверх
ZeeLax
Дата 15.9.2006, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Цитата(nitr @  14.9.2006,  20:40 Найти цитируемый пост)
ZeeLax, списывать надо верно ;) поправь свой код!

nitr, ты попросил, я - поправил. От ошибки своей не отказывался вовсе.


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 15.9.2006, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



ZeeLax, я запутался (неверно понял вопрос) написал рабочий скрипт, но на данный вопрос не дал верного результата smile Всех поправил Nab. Я в свою очередь исправился smile ... 

З.Ы.: просьба не приводить ответы из кукбука smile


--------------------
PM   Вверх
ZeeLax
Дата 15.9.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



nitr, миру - мир smile


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
amg
Дата 15.9.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



До кучи, вот такое решение (прямо скажем, через ж...)
Код

my @arr = sort(@array1,@array2);
(my $str="@arr")=~s/(\S+)\b($"\1\b)+//g;
@array3 = split /$"+/, $str;

Ну и немного измененное из Perl Cookbook (вдруг человеку эта книга недоступна)
Код

foreach (@array1, @array2) { $count{$_}++ }

foreach (keys %count) {
    push @array3, $_ if $count{$_} != 2;
}

Надо иметь в виду, что эти и некоторые другие решения не будут работать правильно, если массивы содержат неуникальные элементы. Исправить ситуацию можно так (опять же, из Cookbook):
Код

%seen = ();
@array = grep { ! $seen{$_} ++ } @array;

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



данный код тож не даст результат smile 
@array = grep { ! $seen{$_} ++ } @array;

з.ы.: первый - ужас ;)

Это сообщение отредактировал(а) nitr - 15.9.2006, 10:08


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


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



Привет, любителям экспериментов!  smile 

Мой вариант:
Код

use strict;
use Data::Dumper;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );

my $unique;
exists $unique->{$_} ? delete $unique->{$_} : $unique->{$_}++ foreach @array1, @array2;

print Dumper [sort keys %$unique];


Результат:
Код

$VAR1 = [
          'a',
          'c',
          'i'
        ];


 smile 


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
amg
Дата 15.9.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(nitr @  15.9.2006,  10:06 Найти цитируемый пост)
данный код тож не даст результат  @array = grep { ! $seen{$_} ++ } @array;
Я хотел сказать, что этот код удаляет из массива @array неуникальные элементы

Цитата
з.ы.: первый - ужас ;)
Это точно! Нечитабельный, наверняка неэффективный, будет глючить, если что не так. В общем, я считаю, отличный пример того, как НЕ надо делать.

Добавлено @ 10:49 
Цитата(sharq @  15.9.2006,  10:43 Найти цитируемый пост)
Мой вариант:
Долго я ждал решения в одну строку. Наконец то!

PM MAIL   Вверх
nitr
Дата 15.9.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



а так? smile)
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);
my $count = ($#array1 > $#array2) ? $#array1 : $#array2;

"@array2" !~ /\b$array1[$_]\b/ ? push @array3, $array1[$_] : 0 foreach 0..$count;

print "@array3";


Это сообщение отредактировал(а) nitr - 15.9.2006, 11:02


--------------------
PM   Вверх
amg
Дата 15.9.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(nitr @  15.9.2006,  11:01 Найти цитируемый пост)
а так?
Работает!

А вот так - нет! smile 
Код

#!/usr/bin/perl -w
my @array2 = qw(a b c d i f);
my @array1 = qw(b d f);
my $count = ($#array1 > $#array2) ? $#array1 : $#array2;

"@array2" !~ /\b$array1[$_]\b/ ? push @array3, $array1[$_] : 0 foreach 0..$count;

print "@array3";
Но задумка мне очень понравилась.

Это сообщение отредактировал(а) amg - 15.9.2006, 11:26
PM MAIL   Вверх
nitr
Дата 15.9.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



а с ссылками так? smile (новое)
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);
my $count = ($#array1 > $#array2) ? $#array1 : $#array2;

foreach my $i (0..$count) {
    $array3->{$array1[$i]} ++ unless map {/^\Q$array1[$i]\E$/} @array2;
}

print join "", sort keys %$array3;


Добавлено @ 11:44 
и код рабочий!
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);
my $count = ($#array1 > $#array2) ? $#array1 : $#array2;

"@array2" !~ /\b$array1[$_]\b/ ? push @array3, $array1[$_] : 0 foreach 0..$count;

print "@array3";

Код

D:\>2.pl
a c i
D:\>


Добавлено @ 11:45 
но он глупый smile


--------------------
PM   Вверх
meridian
Дата 15.9.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, нужно было действительно разницу массивов без 2-х foreach

будет ли код работать, если 1-й массив будет меньше 2-ого ?

Это сообщение отредактировал(а) meridian - 15.9.2006, 12:01
PM   Вверх
nitr
Дата 15.9.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



вот лучше smile
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);

foreach my $i (@array1) {
    $array3->{$i} ++ unless map {/^\Q$i\E$/} @array2;
}

print join "", sort keys %$array3;



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(nitr @  15.9.2006,  11:42 Найти цитируемый пост)
и код рабочий!
Ну да, рабочий, если @array1 > @array2, а вот если наоборот... Я придумал, как исправить:
Код

@a = qw(a c d i f b);
@b = qw(b d f);

($#a > $#b) ? do{$r=\@a;$q=\@b} : do{$r=\@b;$q=\@a};
"@{$q}" !~ /\b${$r}[$_]\b/ ? push @c, ${$r}[$_] : 0 foreach 0..$#{$r};

print "@c\n";

PM MAIL   Вверх
nitr
Дата 15.9.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



строчку 6 в http://forum.vingrad.ru/index.php?showtopi...st&p=855508
можно так
Код

$array3->{$i} ++ unless grep {/\b$i\b/} @array2;



--------------------
PM   Вверх
amg
Дата 15.9.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(nitr @  15.9.2006,  11:47 Найти цитируемый пост)
вот лучше
Тоже не работает, если @array1 < @array2.

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



amg, добавивь твои комменты smile , которые я щас прочёл

Добавлено @ 12:17 
короче, не мучиемся ;)
используем код sharq и учимся так же программить


--------------------
PM   Вверх
Danissimo
Дата 15.9.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно так:

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );

my %x;
@x{@array1} = (1) x @array1;
delete @x{@array2};
print join ' ', sort keys %x;

Добавлено @ 12:28 
Выше была разность двух множеств. А вот их обединение:

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );

my %x;
@x{@array1} = (1) x @array1;
@x{@array2} = (1) x @array2;
print join ' ', sort keys %x;
PM MAIL   Вверх
amg
Дата 15.9.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Danissimo @  15.9.2006,  12:23 Найти цитируемый пост)
Можно так:
Все та же проблема: не работает, если второй массив длиннее первого

PM MAIL   Вверх
Danissimo
Дата 15.9.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ты про объединение? или про разность? Объединение работает. Разность тоже работает. И выдает правильный результат. Имейте в виду, что разность -- некомутативная операция. Так что все правильно работает.

Другими словами, если множество X полностью является подмножеством Y, то вычитая из X Y, получаем пустое множество.

Добавлено @ 13:39 
А вот иллюстрация:

my @array2 = qw( a b c d i f );
my @array1 = qw( b d g );

my %x;
@x{@array1} = (1) x @array1;
delete @x{@array2};
print join ' ', sort keys %x;

Здесь множество array1 не является полным подмножеством array2. Что и сказывается на результате.
PM MAIL   Вверх
nitr
Дата 15.9.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



amg :) ты меня вынуждаешь извращаться :)
Код

#!/usr/bin/perl -w
my @array2 = qw(a b c d i f);
my @array1 = qw(b d f);
my @array3 = (@array1, @array2);

foreach my $i (@array3) {
    $array3->{$i} ++ unless grep {/\b$i\b/} @array2 && grep {/\b$i\b/} @array1;
}

print join "", sort keys %$array3;

и кста, Danissimo, свой код "подсвечивай"!


--------------------
PM   Вверх
amg
Дата 15.9.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(Danissimo @  15.9.2006,  13:37 Найти цитируемый пост)
Ты про объединение? или про разность? Объединение работает. Разность тоже работает. И выдает правильный результат. Имейте в виду, что разность -- некомутативная операция. Так что все правильно работает.
Я про операцию, которая в некоторых книжках называется "симметричная разность". Перечитав еще раз самый первый пост, думаю, что именно коммутативная "симметричная разность" и была нужна.

Цитата(nitr @  15.9.2006,  13:41 Найти цитируемый пост)
amg smile ты меня вынуждаешь извращаться smile
 smile Так мы как раз этим и занимаемся уже по крайней мере всю вторую половину этой темы. Но для меня лично такие извращения - хороший тренинг.
Кстати, nitr, понимаю, что выгляжу полным занудой, но твой последний код опять не работает, если поменять @array2 и @array1. (Чтобы работал, надо в нем && заменить на and).
PM MAIL   Вверх
meridian
Дата 15.9.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо sharq, amg, nitr и остальным извращенцам   smile 
Работает как надо, проверил все.

PM   Вверх
Nab
Дата 18.9.2006, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я вот тут посмотрел вашу писанину, и таки думаю что у amg идея была лучшая, но вы все одно кудато не туда рвонулиsmile
вот вариант в одну строку :

Код

@arr = split('\s',(($arr = "@{[sort(@array1,@array2)]}") =~ s/(\S+)\s+\1\s+//g)?$arr:'');

даст результат если в изначальных масивах значения уникальны, то есть в сумме дают 2, ну или четное число.
кстати вариант sharq тоже этим страдает...

А этот вариант дает разницу двух массивов, при условии что значения массивов не содержат символов пробела

Код

@arr = ((($_ = "@{[sort(@array1,@array2)]}") =~ s/(\S+)\s+(\1\s*)+//g)?$_:'')&&split;

можно тут конечно извратиться с заменой стандартного разделителя, но эт уже не то smile


Это сообщение отредактировал(а) Nab - 18.9.2006, 07:32


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Nab
Дата 18.9.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот блин дурная голова рукам спокоя не дает smile
Упростил...
Код

@arr = ($_="@{[sort(@array1,@array2)]}")=~s/(\S+)\s+(\1\s*)+//g&&split;



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 18.9.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Nab, респект!
Внёс твой однострочник (немного его модифицировав) в свою коллекцию Perl one-liners (там как раз разности не хватало)
Код

# Симметричная разность файлов (не содержащих неуникальных строк)
perl -e 'undef $"; ($_="@{[sort(<>)]}")=~s/(.+)\n\1\n//g; print' file1 file2

PM MAIL   Вверх
Nab
Дата 18.9.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



знаешь почему у меня в конце звезда стоит и плюсик?

Звезда потому что на последней строке файла окончания нет, и твоя регулярка не сработает, а моя сработает.

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

А вот первый плюсик у тебя не знаю к чему приведет, по крайней мере куча просто переводов строк у тебя не удалятся...


если же тебя такое поведение устраивает, то можно еще более упростить твою регулярку...

Код

perl -e 'undef $"; ($_="@{[sort(<>)]}")=~s/(.*\n)\1//g; print' file1 file2



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


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

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


 




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


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

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