Я пишу программу для перехода по дереву каталогов (да, я знаю о File :: Find, но я пишу замену).
В моей программе я делаю readdir
для всего каталога и помещаю его в список. Мне нужно сделать две вещи:
- Удалить
.
и ..
из списка
- Добавить имя текущего каталога в каждом файле.
Я могу сделать это с помощью цикла, или я могу использовать map
и grep
:
# Map and Grep
my @dir_stack = readdir $dir_fh;;
@dir_stack = grep { !/^\.{1,2}$/ } @dir_stack;
@dir_stack = reverse map { "$cwd/$_" } @dir_stack;
push @stack, @dir_stack;
# Read Loop
opendir $dir_fh, $cwd;
my @dir_stack;
foreach my $file (readdir $dir_fh) {
next if $file =~ /^\.{1,2}$/; #Skip "." and ".."
unshift @dir_stack, "$cwd/$file";
}
push @stack, @dir_stack;
А как насчет объединения grep
и map
?
opendir $dir_fh, $cwd;
my @dir_stack = readdir $dir_fh;;
@dir_stack = grep { !/^\.{1,2}$/ && {$_ = "$cwd/$_"} } @dir_stack;
push @stack, reverse @dir_stack;
Я хочу, чтобы мой код был читаемым на следующей неделе, когда я посмотрю на него и попытаюсь выяснить, что происходит. Мне также нужен мой код, чтобы быть эффективным.