Forum Webscript.Ru

Программирование => Perl => Тема начата: от 25 Января 2002, 11:31:38

Название: Плиз! Что-то заработался!
Отправлено: от 25 Января 2002, 11:31:38
Столько уже скриптов написал за свою жизнь! Всё получалось и сложное и не очень! А вот простой преметив решить что-то не могу! (За книгой в лом пока идти) Вообщемнужно просканить директорию и показать юзеру все диры которые есть в текущей дире. (Файлов не надо)!  Как вывести все файлы я знаю глобом можно. А мне надо именно дериктории и больше ничего! Прешите кусок плиз.... Чтоб мне в книгу не лезть!
Название: Плиз! Что-то заработался!
Отправлено: от 25 Января 2002, 12:39:19
opendir(D,\'.\');
@all=readdir D;
closedir(D);

@dirs;

foreach $elem(@all)
{
    if($elem =~ m/(\\.){1,2}/)
    {
         next;
    }
    if(-d $elem)
    {
        push @dirs,$elem;
    }
}

И всё. В @dirs - директории
Название: Плиз! Что-то заработался!
Отправлено: Chs от 25 Января 2002, 13:24:13
Цитировать

if($elem =~ m/(\\.){1,2}/)
{
next;
}


:):) Одна из самых распространенных ошибок - игнорируются директории (файлы) содержащие в названии точку.
Название: Плиз! Что-то заработался!
Отправлено: Oak от 25 Января 2002, 17:48:35
А надо ^\\. ? (заодно будет прятать hidden файлы)
Название: да не
Отправлено: Green Kakadu от 26 Января 2002, 00:38:57
Цитировать
А надо ^\\. ?

ведь директория может быть и такой:
.dir
просто
if($elem =~ m/(\\.){1,2}/)
{
next;
}

можно смело выкинуть. Очевидно, чел-к хотел (помимо файлов) отсеять . и ..
можно было это сделать вначале:
(undef, undef,@all)=readdir D;
Название: Всё по другому!
Отправлено: markers от 26 Января 2002, 09:51:14
Спасибо вам! Но ваш код показывает лишь последнюю папку! Но это не важно.Там видно просто ошибка в цикле! Я уже сделал алгоритм(вернее взаимствовал) он более сложнее но работает как часы! Вот он!

    opendir (DIR, $directory) or &cgierr ("Не возможно открыть папку: \'$directory\'.\\nСообщение: $!");
    my @ls = readdir(DIR);
    closedir (DIR);
    FILE: foreach $file (@ls) {
        next FILE if  ($file eq \'.\');
        next FILE if ($file eq \'..\');

        $fullfile = "$directory/$file";
        if (-d $fullfile ) {
                $directory{$file} .= qq~$file\\n~;
            }
    }
    foreach (sort keys %directory) {
        push (@dirs,$directory{$_});
    }

Вот вроде этого!
Будут предложения по улучшению! Пишите я всё учту!
Да и есть у кого-нибудь хороший чат с внешними настройками?
Всем спасибо! Пока!
Название: вот
Отправлено: Green Kakadu от 26 Января 2002, 14:25:51
#!/usr/bin/perl
my $dir=\'/home\';#путь к директории
my (@in_dir, @dirs);
opendir (DIRS, $dir)||die("Can not opendir, reason  $!");
(undef,undef, @in_dir)=readdir(DIRS);
closedir DIRS;
foreach my $elm(@in_dir){
   if (-d "$dir/$elm"){push(@dirs, $elm);}
}
print @dirs;