Forum Webscript.Ru

Программирование => Perl => Тема начата: Paul56 от 20 Ноября 2007, 13:59:45

Название: массив с директориями
Отправлено: Paul56 от 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 от 20 Ноября 2007, 18:41:06
grep + hash
Название: массив с директориями
Отправлено: Paul56 от 20 Ноября 2007, 22:37:30
А можно поподоробнее плиз?
Название: массив с директориями
Отправлено: arto от 20 Ноября 2007, 23:21:53
@iskl{@iskl} = @iskl;

grep { not exists $iskl{$_} } @dir;
Название: массив с директориями
Отправлено: ravshaniy от 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;
}

может быть эта функция понадобится еще, так ради читаемости
Название: массив с директориями
Отправлено: arto от 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 от 01 Декабря 2007, 01:21:37
да крайне не эффективно, я подумаю еще

хотя думать тут особо не о чем (