Автор Тема: массив с директориями  (Прочитано 3109 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Paul56

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
массив с директориями
« : 20 Ноября 2007, 13:59:45 »
Ребята, подскажите пожалуйста:
Есть массив с директориями
например:
opendir (DIR, "./") || die print "$!";
@dir = readdir(DIR);
close(dir);

Есть ещё один массив:
@iskl=("i", "lightsoft", "price", "free_tour.swf", "index.cgi", "search.cgi", "style.css", ".", "..");

как из массива @dir исключить массив @iskl.

За ранее спасибо за ответ.

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
массив с директориями
« Ответ #1 : 20 Ноября 2007, 18:41:06 »
grep + hash

Оффлайн Paul56

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
массив с директориями
« Ответ #2 : 20 Ноября 2007, 22:37:30 »
А можно поподоробнее плиз?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
массив с директориями
« Ответ #3 : 20 Ноября 2007, 23:21:53 »
@iskl{@iskl} = @iskl;

grep { not exists $iskl{$_} } @dir;

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
массив с директориями
« Ответ #4 : 30 Ноября 2007, 18:20:33 »
предлагаю сделать чуть длиннее
Цитировать

@dir = grep { !in_array($_, @iskl) } @dir;
print $_, \' \' foreach @dir;

sub in_array($@){
     my $el = shift;
     my @iskl = @_;
     foreach (@iskl){
      return 1  if ($el eq $_);
     }
     return 0;
}

может быть эта функция понадобится еще, так ради читаемости
« Последнее редактирование: 01 Декабря 2007, 01:25:19 от ravshaniy »
убили кенни, сволочи

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
массив с директориями
« Ответ #5 : 30 Ноября 2007, 19:10:57 »
# perl -MBenchmark=timethese -de0
...
DB<2> @iskl = map { join "",map { qw(a b c d)[int rand 4] } 1..5 } 1..16
                                                                                                    DB<3> @dir = map { join "",map { qw(a b c d)[int rand 4] } 1..5 } 1..64
                                                                                                    DB<4> sub A () { @iskl{@iskl} = @iskl; return grep { not exists $iskl{$_} } @dir; }
                                                                                                    DB<5> sub B () { return grep { !in_array($_, @iskl) } @dir; }

DB<6> timethese (100_000,{\'A\' => \\&A,\'B\' => \\&B})
Benchmark: timing 100000 iterations of A, B...
         A:  5 wallclock secs ( 5.72 usr +  0.02 sys =  5.74 CPU) @ 17421.60/s (n=100000)
         B: 162 wallclock secs (160.46 usr +  0.40 sys = 160.86 CPU) @ 621.66/s (n=100000)

даже не ожидал, насколько ваше решение будет неэффективным

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
массив с директориями
« Ответ #6 : 01 Декабря 2007, 01:21:37 »
да крайне не эффективно, я подумаю еще

хотя думать тут особо не о чем (
« Последнее редактирование: 01 Декабря 2007, 02:28:05 от ravshaniy »
убили кенни, сволочи

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28