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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование массива из 2-х с уник. значеними 
V
    Опции темы
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   Вверх
Страницы: (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.0549 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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