Forum Webscript.Ru

Программирование => Perl => Тема начата: Error202 от 09 Ноября 2005, 14:08:07

Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 14:08:07
Есть 2 массива, вних разные значения, но иногда бывают одинаковые.

Каким образом я могу вырезать из второго массива все записи, которые встречаются в первом? И также нежно создать 3 массив, куда бы вписывались номера удаленных элементов...?
Название: Массивы
Отправлено: arto от 09 Ноября 2005, 14:27:41
my $re = "(?:" . join ("|",@ary1) . ")";
my @ary3 = grep !/^$re$/o,@ary2
Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 14:37:21
То что надо! Спасибо...
Только вот вопрс, как изменить код для:

У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие записи в др. массивах (SecondPhone, SecondWork)

P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
Название: Массивы
Отправлено: commander от 09 Ноября 2005, 14:38:49
arto
красиво, но ИМХО медленно...

Error202
map {for my $el(@arr1){push @arr3, $_ if $_==$el}}@arr2;
Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 14:47:08
Что-то у меня эта штука работает неверно... :(
Выдает кучу одинаковых результатов...
Название: Массивы
Отправлено: commander от 09 Ноября 2005, 14:54:46
Error202
пардон... видимо не правильно понял задачу...
map {my $i=0;for my $el(@arr1){$i=1, $_ if $_==$el} push @arr3, $_ if !$i}@arr2;


P.S. придет Влад... и всем нос утрет... :)
Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 15:01:09
Да работает... Спасибо...
...
Возвращаясь к моему 2-му посту:

У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие (по номеру, точнее индексу) записи в др. массивах (SecondPhone, SecondWork)

P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
Все массивы SecondXXX - имеют равное кол-во записей...
Название: Массивы
Отправлено: arto от 09 Ноября 2005, 15:22:09
# perl -MBenchmark -de0
  DB<1> @a = qw(1 3 5 7 9)
  DB<2> @b = qw(a d f 5 h 7 r 1 l 3 p)
  DB<3> $re = "(?:" . join ("|",@a) . ")"
  DB<4> timethese (1_000_000,{\'A\' => sub { my @c = grep !/^$re$/o,@b; },\'B\' => sub { map { my $i = 0; for my $el (@a){$i = 1, $_ if $_ eq $el} push @c, $_ if !$i} @b;} })
Benchmark: timing 1000000 iterations of A, B...
         A: 35 wallclock secs (30.43 usr +  0.10 sys = 30.53 CPU) @ 32754.67/s (n=1000000)
         B: 85 wallclock secs (74.15 usr +  1.46 sys = 75.61 CPU) @ 13225.76/s (n=1000000)
Название: Массивы
Отправлено: arto от 09 Ноября 2005, 16:18:35
my $i = -1;
my $re = ...
my @ary3 = grep { $i++; if (m|^$re$|) { splice @secary1,$i--,1; 0 } else { 1 } } @ary2;
Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 16:22:55
Спасибо!
Название: Массивы
Отправлено: Error202 от 09 Ноября 2005, 16:26:15
А можно ли как-нть быстро объединить 3 массива таким образом:
[А1 А2 А3 А4 А5]
[Б1 Б2 Б3 Б4 Б5]
[В1 В2 В3 В4 В5]

объединить в один вида:
[А1 Б1 В1 А2 Б2 В2 и т.д.] ?
Название: Массивы
Отправлено: arto от 09 Ноября 2005, 16:27:36
or

my $i = 0;
my $re = ...
my @ary3 = grep { if (m|^$re$|) { splice @secary1,$i,1; 0 } else { ++$i } } @ary2;
Название: Массивы
Отправлено: commander от 09 Ноября 2005, 17:20:04
arto
хммм.... твоя правда.. :)
Название: Массивы
Отправлено: NeoNox от 09 Ноября 2005, 17:23:13
Цитировать
Error202:
А можно ли как-нть быстро объединить 3 массива таким образом:

  DB<1> @a = (A1, A2)

  DB<2> @b = (B1, B2)

  DB<3> @a = sort { (split//,$a)[1] <=> (split//,$b)[1] } (@a, @b)

  DB<4> p @a
A1B1A2B2