Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами и каталогами, Изучение языка Perl 
:(
    Опции темы
Jeka from Doneck
Дата 13.10.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



В ходе изучения языка в теме по работе с файлами и папками столкнулся со следующей задачей. Их несколько но это наиболее простая. 

Пройти по дереву каталогов,  начиная с текущего и вывести весь список файлов, содержащих внутри строки файла, у которых в пятом поле будет три буквы "а", не обязательно подряд, и имеющих шаблон имени файла, начинающегося с точки и содержащего внутри символы в заданной последовательности "set" и старше одного месяца с правами только на чтение

Буду очень признателен если поможете в изучении и решении данного примера. Думаю следующие за ней задания по примеру выполнить. 
PM MAIL   Вверх
gcc
Дата 13.10.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



сказали бы $ uname -r

а кто такое задал?

Это сообщение отредактировал(а) gcc - 13.10.2008, 18:02
PM WWW ICQ Skype GTalk Jabber   Вверх
Jeka from Doneck
Дата 13.10.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



Никто не задал, я по сборнику по Perl беру это. Под редакцией Костина В.В. Вроде .

Щас вот после работы приехал, есть свободный вечер и думал поразбираться. 
И попросил помочь с решением написанной мною задачи.
PM MAIL   Вверх
arto
Дата 13.10.2008, 18:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc perlfunc nа предмет opendir, readdir, closedir, stat
PM MAIL ICQ   Вверх
Jeka from Doneck
Дата 13.10.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



arto Уважаемый, мне такой совет может мой 4 летний ребенок дать (в справке посмотреть), я не для этого условие написал, выше уже написал что необходимо. Те кто хорошо разбирается буду очень признателен в помощи.
PM MAIL   Вверх
gcc
Дата 13.10.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



про отрытие каталогов и файлов есть в книге "perl за 24 часа"
про массивы там тоже есть

вот скрипт загрузки файлов из каталога на сервер 
Код


#!/usr/bin/perl -w
$test = "http://bla-bla.ua/index.php?action=gallery&sa=add2";

opendir(TEMPDIR, '/usr/home/...../1g') ||
     die "bla-bla /tmp: $!";
@files=readdir TEMPDIR;
closedir(TEMPDIR);

for ($index=0; $index<@files; $index++) {

$file = "/usr/home/....../1g/$files[$index]";

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use CGI qw(header -no_debug);

my $req = POST $test,
Content_Type => 'form-data',
Content      => [
        title => 'vasya',
    cat => '1',
       picture => [$file],
                ];
my $res = LWP::UserAgent->new->request($req);
print header, $res->is_success ? $res->content : $res->status_line;
print $req->as_string;

}


Это сообщение отредактировал(а) gcc - 13.10.2008, 18:30
PM WWW ICQ Skype GTalk Jabber   Вверх
kavkaz
Дата 13.10.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 26.12.2007

Репутация: 1
Всего: 2



Уважаемый Jeka from Doneck, вы сами сказали что изучаете язык, стало быть вам не нужно готовое решение, давайте вы подробнее опишите проблему связанную с решением задачи а мы направим в нужное русло.
1. 
Цитата
Пройти по дереву каталогов,  начиная с текущего

2. 
Цитата
вывести весь список файлов, содержащих внутри строки файла, у которых в пятом поле будет три буквы "а", не обязательно подряд

тут я немного не понимаю что значит "пятое поле"...
3. 
Цитата
имеющих шаблон имени файла, начинающегося с точки и содержащего внутри символы в заданной последовательности "set" и старше одного месяца с правами только на чтение


предполагаю что пункт2 и пункт3 надо поменять местами...

так вот теперь по пунктам, где вы испытываете сложности?
просто если вы не знаете как считать в массив список содержащихся файлов, то так и напишите. Наверняка какие то моменты из задачи вы и сами способны решить
PM MAIL ICQ Skype   Вверх
Jeka from Doneck
Дата 13.10.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



ВОт код программы 
Код

#!/usr/bin/perl
use locale;
my @dir_list = ("D:/LABS/FolderLab3");
scan_dir(\@dir_list);

sub scan_dir {
    my $dir  = shift @{$_[0]} || return;
    opendir(DIR, $dir) or die "Can't open directory '$dir': $!\n";
    while (my $file = readdir DIR) {
        next if $file =~ /^\.\.?$/;
          #  $data_sozd = -A "$dir/$file";

    if (-d "$dir/$file")
        {
            unshift(@{$_[0]},join("/",$dir,$file))
        } else {
#==============================ПРОВЕРКА ФАЙЛА================================================
        if (($file =~ m/^[^0-9][А-Яа-я]{2}[A-Za-z\.]{1,}$/i)) {
                 $ffx =  open(ML, "$dir/$file");
            $data_sozd = -M ML;
            print '111 '.$data_sozd." 222\n";
            if (   (-r "$dir/$file") && ($data_sozd>30) )
               {
 #-----------ПРОВЕРКА СОДЕРЖТМОГО ФАЙЛА--------------------
                $pr1 = 0;
                open(ML, "$dir/$file");
                while ($line = <ML>)
                {
                    $string = $string.$line;
                };
                $string =~ s/(\w+)/PrChars($&)/ige;
                sub PrChars{
                     my($text)=$&;
                    my($res,$chr,$i);
                     for($i=0;$i<=length($text);$i++)
                       {
                            $chr = substr($text,$i,1);
                            if ($i % 2 != 0)
                                                {    $res.=$chr;
                                                 if ($chr ne (lc($chr)))
                                                        { $pr1 = 1;
                                                        };
                                                }
                                        }
                 return $res;
                }
                close(ML);

                if ($pr1 == 0)
                                { # copy("$dir/$file", "D:/b.txt"); unlink ("$dir/$file");
                    print $data_sozd;
 # rename ("$dir/$file","D:/OUT/$file");
                            print ' |переносим файл: '."$dir/$file\n";
                }

 #---------------------------------------------------------
               };
        };
#============================================================================================
               } #end else
  }
    closedir(DIR);
    scan_dir($_[0]);
}


тут не совсем то задание, почти как требуется сделал. помогите доделать

Это сообщение отредактировал(а) sharq - 13.10.2008, 22:56
PM MAIL   Вверх
ginnie
Дата 13.10.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Jeka from Doneck, мы тут все хамы ужасные, очень любим над новичками поиздеваться, пока они еще опыта достаточно не набрались и сдачи дать не могут  smile 

Боюсь даже предположить, каким словом Вы меня назовете в ответ на предложение добавить в начало программы

Код

use strict;
use warnings;


это предложение тоже из секции "советы четырехлетних".


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
kavkaz
Дата 13.10.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 26.12.2007

Репутация: 1
Всего: 2



Jeka from Doneck, нет возможности да и желания (именно в такой последовательности) запускать и проверять программу...

вы конретно скажите где затык то?

и наберитесь терпения  smile  советом ginnie не пренебрегайте, а воспользуйтесь в первую очередь smile 
PM MAIL ICQ Skype   Вверх
ginnie
Дата 13.10.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



P.S. вопросы на засыпку:

как по-вашему работает фрагмент

Код

$string =~ s/(\w+)/PrChars($&)/ige;
sub PrChars{
                     my($text)=$&;



у Вас так и задумано, что $string не инициализируется внутри вызова scan_dir() и сохраняет свое значение между вызовами?


зачем в рег. выражении 

Код

m/^[^0-9][А-Яа-я]{2}[A-Za-z\.]{1,}$/i


модификатор i ?

и самое главное: как мы можем помочь доделать, если Вы не написали, что у Вас не получается (т.е. что работает не так, как должно).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 14.10.2008, 07:28 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Jeka from Doneck @  13.10.2008,  17:54 Найти цитируемый пост)
Пройти по дереву каталогов,  начиная с текущего и вывести весь список файлов, содержащих внутри строки файла, у которых в пятом поле будет три буквы "а", не обязательно подряд, и имеющих шаблон имени файла, начинающегося с точки и содержащего внутри символы в заданной последовательности "set" и старше одного месяца с правами только на чтение
Я позволил себе немного переиначить условие в непонятных для меня местах
Код
my $set = 'set';
use File::Find;      # Пройти по дереву каталогов,
find(\&wanted, '.'); # начиная с текущего и
sub wanted {         # вывести весь список файлов,
  m/^\./     &&      # имеющих шаблон имени файла, начинающегося с точки и
  m/$set/o   &&      # содержащего внутри символы из переменной "$set"
  -M() > 30  &&      # старше одного месяца
  -r && ! -w &&      # с правами только на чтение
  sub{               # содержащих внутри только те строки, у которых  будет 
    open F, '<', shift or return 0;
    while (<F>) {
      my $field = (split)[4]; # в пятом поле (поле - последовательность непробельных символов)
      return 0 if $field=~tr/a/a/ != 3; # ровно три буквы "а"
    }
    close F;
    1
  }->($_)    &&
  print "$File::Find::name\n";
}

PM MAIL   Вверх
ginnie
Дата 14.10.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



amg, может еще добавить -f, чтобы не обрабатывать директории?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 14.10.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(ginnie @  14.10.2008,  11:32 Найти цитируемый пост)
может еще добавить -f, чтобы не обрабатывать директории?
Это следовало бы сделать. А еще -- поставить условие ! -w на первое место, как самое редкое в "обычной жизни". smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.