Forum Webscript.Ru
Программирование => Perl => Тема начата: 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.
За ранее спасибо за ответ.
-
grep + hash
-
А можно поподоробнее плиз?
-
@iskl{@iskl} = @iskl;
grep { not exists $iskl{$_} } @dir;
-
предлагаю сделать чуть длиннее
@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;
}
может быть эта функция понадобится еще, так ради читаемости
-
# 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)
даже не ожидал, насколько ваше решение будет неэффективным
-
да крайне не эффективно, я подумаю еще
хотя думать тут особо не о чем (