![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
murka |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 6.12.2005 Где: Волгоград Репутация: нет Всего: 2 |
![]() Читаю директорию и делаю определенные действия над каждым из её объектов. Вложенность неопределена, нужно просмотреть все файлы во всех папках. Запуталась! Как определять папка это или файл и читать директорию могу, а вот как идти дальше во вложенные директории и вернуться обратно - не пойму! Может кто чего подскажет! |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Выделить в отдельную функцию, и вызывать рекурсивно...
Можно с заходом в каждую директорию, можно по полному пути .... выбирайте как удобней... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Вот написал пример, без рекурсии и сторонних модулей. Подробности смотри в комнтариях.
Файл: scan.pl
Запускаешь из командной строки, например вот так: perl scan.pl C:/WINDOWS Врезультате, в том же каталоге, где находится сам файл scan.pl будет создан текстовый файл all_file.txt, в котором будет сохранён список всех вложенных файлов в указанном каталоге, а также и вложенных каталогах. ЗЫ: Код было бы не плохо ещё немного доработать, а так же сократить. Я специально использовал длиные записи, например вот это условие:
можно было бы записать и вот так:
С другой стороны, в этом же условии записывать в файл, только в том случае, если он действительно является файлом, а не чем нить ещё. Потому else можно заменить на elsif(условие), если это конечно нужно. Это сообщение отредактировал(а) korob2001 - 31.7.2006, 17:26 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Вот аналогичный пример с рекурсией:
Программа намного меньше, но с примером без рекурсии можно сделать тоже самое. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Nab |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Мне метод без рекурсии очень понравился, хотя запись в файл в качестве примера не годиться, лучше построить хеш...
А вот второй пример, мне не очень ![]() Я его немного переделаю...
В лучших традициях допишу ![]() Вот эта конструкция:
может быть заменена на :
Но как по мне развернутая форма выигрывает в читабельности ![]() Это сообщение отредактировал(а) Nab - 31.7.2006, 19:24 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Я не спорю, просто некоторые товарисчи предпочитают писать компактно, желательно вообще в одну строку. ![]() -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Не спорю, но мы же не ПерлГольф играем, а помогаем народу понять как оно работает ![]() А если у человека, в особенности у начинающего, вопрос, а он видит ТАКОЕ, что даже прочитать не может, то кому такая помощь нужна? И так все знают кто здесь модер ![]() А те, кто предпочитают писать в одну строчку, обычно задают очень нетривиальные вопросы и знают чего хотят добиться в результате ![]() -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
aksined |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 26.12.2005 Репутация: нет Всего: 1 |
Если вы хотите помочь человеку с обработкой всех файлов, то хотя бы расскажите, как это сделать с помощью модуля, который входит в стандартную поставку. Ставить не надо, а использовать несложно.
Для вас написать несколько красивых решений - это одно. А человек потом все рвно вряд ли будет оформлять функции в виде модуля. Будет их копировать из скрипта в скрипт.
функция find получает список каталогов, ко всем элементам которых будут применена функция, переданная как первый параметр #человек не написал, ему нужно САМОМУ научиться обходить дерево каталогов, или просто нужно обработать все файлы. Если второе, то не нужно писать так много кода |
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Абсолютно поддерживаю...
Вообще, наработанную годами базу в виде стандартных модулей и CPAN глупо игнорировать, ее изучать надо и использовать... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Ну не знаю, я лично пытался помочь человеку с этим:
Не думаю, что здесь человек спрашивал о модуле File::Find, насколько я понял она хотела понять принцип того, как предвигаться по каталогам сверху вниз и в обратном направлении. Да и я считаю, главное понять смысл, потому в первом примере каждая строка прокоментирована. А там глядишь, она напишет свой аналог File::Find, а может ещё чего-нить покруче, независимый от последнего. ЗЫ: Гораздо надёжнее ездить на автомобиле, зная не то лько ПДД, но ещё и устройство автомобиля. Только не подумайте, что ярый противник CPAN, просто некоторые вещи я делаю вручную, точнее я стараюсь как можно меньше привязываться к какому-нить модулю. Это сообщение отредактировал(а) korob2001 - 2.8.2006, 22:28 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
aksined |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 26.12.2005 Репутация: нет Всего: 1 |
Просьба не воспринимать мое сообщение как критику.
Вы готовы помочь - это главное. Причем в ситуациях, когда человек ленится почитать документацию или книгу (ко мне это тоже относится). Я не сторонник и не протифник cpan. Просто, мне кажется, что большей части людей, если и будет нужно понять, как произвести обход дерева(с рекурсией или без), потом все равно нужно будет использовать фунцию из модуля (своего или нет). Почему бы не рассказать о стандартных решениях. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |