Forum Webscript.Ru
Программирование => Perl => Тема начата: Error202 от 09 Ноября 2005, 14:08:07
-
Есть 2 массива, вних разные значения, но иногда бывают одинаковые.
Каким образом я могу вырезать из второго массива все записи, которые встречаются в первом? И также нежно создать 3 массив, куда бы вписывались номера удаленных элементов...?
-
my $re = "(?:" . join ("|",@ary1) . ")";
my @ary3 = grep !/^$re$/o,@ary2
-
То что надо! Спасибо...
Только вот вопрс, как изменить код для:
У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие записи в др. массивах (SecondPhone, SecondWork)
P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
-
arto
красиво, но ИМХО медленно...
Error202
map {for my $el(@arr1){push @arr3, $_ if $_==$el}}@arr2;
-
Что-то у меня эта штука работает неверно... :(
Выдает кучу одинаковых результатов...
-
Error202
пардон... видимо не правильно понял задачу...
map {my $i=0;for my $el(@arr1){$i=1, $_ if $_==$el} push @arr3, $_ if !$i}@arr2;
P.S. придет Влад... и всем нос утрет... :)
-
Да работает... Спасибо...
...
Возвращаясь к моему 2-му посту:
У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие (по номеру, точнее индексу) записи в др. массивах (SecondPhone, SecondWork)
P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
Все массивы SecondXXX - имеют равное кол-во записей...
-
# 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)
-
my $i = -1;
my $re = ...
my @ary3 = grep { $i++; if (m|^$re$|) { splice @secary1,$i--,1; 0 } else { 1 } } @ary2;
-
Спасибо!
-
А можно ли как-нть быстро объединить 3 массива таким образом:
[А1 А2 А3 А4 А5]
[Б1 Б2 Б3 Б4 Б5]
[В1 В2 В3 В4 В5]
объединить в один вида:
[А1 Б1 В1 А2 Б2 В2 и т.д.] ?
-
or
my $i = 0;
my $re = ...
my @ary3 = grep { if (m|^$re$|) { splice @secary1,$i,1; 0 } else { ++$i } } @ary2;
-
arto
хммм.... твоя правда.. :)
-
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