The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите разобрать код"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(ok) on 03-Авг-05, 17:52  (MSK)
Помогите новичку разобраться что делает эта строка:
@ARGV = qw(.) unless @argv;
желательно поподробнее..
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 03-Авг-05, 18:03  (MSK)
если масив @argv пустой, или не существует, @ARGV станет одноелементым массивом, единственный елемент которого -- '.'


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(ok) on 03-Авг-05, 18:10  (MSK)
А этот массив argv - для чего он вообще предназначен? И какой смысл в этом присваивании если эта строка стоит в самом начале кода? Сорри за глупые вопросы..

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 03-Авг-05, 19:07  (MSK)
@ARGV -- это массив, в который записываются аргументы коммандной строки, с кот. запускался перловсий скрипт. @ARGV и @argv - разные переменные. @argv может быть определён где - то в другом месте. до использования @argv есть директивы require?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 04-Авг-05, 12:33  (MSK)
Пардон, Ihor, за задержку. Вот полный код:
open(log1,'>log1');
@ARGV = qw(.) unless @argv;
use File::Find;
find sub { print log1 $File::Find::name, -d && '/'. "\n"}, @ARGV;
close(log1)
Программка записывает в файл имена всех файлов и подкаталогов. Одна проблемка: все имена файлов подкаталога пишутся сплошной строкой, а как сделать на каждый файл отдельную строку шот мозгов не хватает...
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 04-Авг-05, 13:04  (MSK)
по всей видимости, имелось в виду вот что:
# =======================================
open(log1,'>log1');
@ARGV = qw(.) unless @ARGV;
use File::Find;
find sub { print log1 $File::Find::name, -d && '/', "\n"}, @ARGV;
close(log1)
# ======================================
но стиль -- жуткий(IMHO)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 04-Авг-05, 13:23  (MSK)
Дык, может подскажете как сделать печать каждого файла в отдельной строке?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 04-Авг-05, 13:26  (MSK)
вот то, что я написал, уже с нужными исправлениями


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 04-Авг-05, 14:46  (MSK)
Сразу 2 вопроса:
1. Я так понял из Ваших объяснений во второй строке создаётся одноэлементный массив ARGV и $ARGV[0]='.'? А почему нельзя вставить qw(a)? Пишет не могу найти путь или директорию?
2. Далее в 4-й строке ....."}, @ARGV - что это означает? Почему, допустим, без @ARGV программа не работает?
3. И на последок: как сделать, что бы имена файлов выводились с полными относительными путями?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 04-Авг-05, 15:09  (MSK)
Кстат, оказывается под виндой с этой задачей отлично справляется
dir /s /b > log
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 04-Авг-05, 15:32  (MSK)
идея такая: скрипт получает из коммандной строки список каталогов, которые он потом обходит и выводит все файлы и каталоги, кот. содержаться в заданных каталогах. если скрипт запускается без аргументов, он считает, что нужно сделать работу для текущего каталога. итак, если скрипт вызывался со списком каталогов в коммандной строке, этот список будет содержаться в @ARGV. если в коммандной строке ничего не было, т.е. @ARGV -- пустой, помещаем в @ARGV текущий каталог -- '.', т.е. @ARGV = ('.') (или, что то - же самое  @ARGV = qw(.)). если вы вставите вместо qw(.) - qw(a), это будет значить, что вы задаёте для обхода подкаталог 'a' текущего каталога. если у вас такого подкаталога нет -- получите указанную ошибку.

'find sub { print log1 $File::Find::name, -d && '/', "\n"}, @ARGV;' -- знасит следующее: мы вызываем функцию find, в качестве первого аргумента указываем ссылку на функцию, кот, будет вызываться для каждого найденного файла/каталога, в качетсве второго -- список, кот. содержит каталоги, кот. нужно обойти, в нашем случае - @ARGV. реальный обход деревьев выполняет именно 'find'. т.о. если вы не укажете второй аргумент, функция вылетит с ошибкой или ничего делать не будет.

ответ на 4 -- укажите в коммандной строке полный путь к каталогу, или запишите его вместо '.'  в @ARGV. напр. @ARGV = ('/usr/local') или @ARGV = ('c:\TEMP') (в Windows).


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 04-Авг-05, 18:11  (MSK)
Спасибо, многое прояснилось, однак
@ARGV = qw('e:\temp') unless @ARGV; всё равно не работает, не находит путь почему-то...
@ARGV = qw('/usr/bin') unless @ARGV; - тож самое...
Насчёт вопроса №3, я получаю примерно след. результат
./ERWREW/SHGF/
./ERWREW/SHGF/gfsfdg.txt
./install.log
а мне нужно
./ERWREW/SHGF/
./ERWREW/SHGF/gfsfdg.txt
./ERWREW/SHGF/install.log
Может подскажите чего?


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Помогите разобрать код" 
Сообщение от ihor Искать по авторуВ закладки on 04-Авг-05, 19:09  (MSK)
qw('e:\temp')
qw('/usr/bin')

-- кавычек не надо, т.к. фунция qw сама добавляет кавычки, т.е. должно быть просто qw(e:\temp).
вообще qw(word1 word2 word3 word4) эквивалентно ('word1', 'word2', 'word3', 'word4').

./install.log -- файл, который лежит в текущем каталоге
./ERWREW/SHGF/install.log -- файл, который лежит в каталоге SHGF, который лежит в каталоге ERWREW, который лежит в текущем каталоге, так что это разные файлы. может, я вопрос не понимаю?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 05-Авг-05, 10:52  (MSK)
Запустите под виндой
dir /s /b > log
В log как раз то, что мне нужно. Мне интересно есть что-то более менее стандартное в перле для получения такого файла?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "Помогите разобрать код" 
Сообщение от Sereg Искать по авторуВ закладки(??) on 05-Авг-05, 11:00  (MSK)
Огромное спасибо, Ihor, всёполучилось.


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру