The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Помогите разобрать код, !*! Sereg, 03-Авг-05, 17:52  [смотреть все]
Помогите новичку разобраться что делает эта строка:
@ARGV = qw(.) unless @argv;
желательно поподробнее..
  • Помогите разобрать код, !*! ihor, 18:03 , 03-Авг-05 (1)
    если масив @argv пустой, или не существует, @ARGV станет одноелементым массивом, единственный елемент которого -- '.'


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

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

        • Помогите разобрать код, !*! Sereg, 12:33 , 04-Авг-05 (4)
          Пардон, Ihor, за задержку. Вот полный код:
          open(log1,'>log1');
          @ARGV = qw(.) unless @argv;
          use File::Find;
          find sub { print log1 $File::Find::name, -d && '/'. "\n"}, @ARGV;
          close(log1)
          Программка записывает в файл имена всех файлов и подкаталогов. Одна проблемка: все имена файлов подкаталога пишутся сплошной строкой, а как сделать на каждый файл отдельную строку шот мозгов не хватает...
          • Помогите разобрать код, !*! ihor, 13:04 , 04-Авг-05 (5)
            по всей видимости, имелось в виду вот что:
            # =======================================
            open(log1,'>log1');
            @ARGV = qw(.) unless @ARGV;
            use File::Find;
            find sub { print log1 $File::Find::name, -d && '/', "\n"}, @ARGV;
            close(log1)
            # ======================================
            но стиль -- жуткий(IMHO)

            • Помогите разобрать код, !*! Sereg, 13:23 , 04-Авг-05 (6)
              Дык, может подскажете как сделать печать каждого файла в отдельной строке?

              • Помогите разобрать код, !*! ihor, 13:26 , 04-Авг-05 (7)
                вот то, что я написал, уже с нужными исправлениями


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

                  • Помогите разобрать код, !*! Sereg, 15:09 , 04-Авг-05 (9)
                    Кстат, оказывается под виндой с этой задачей отлично справляется
                    dir /s /b > log
                  • Помогите разобрать код, !*! ihor, 15:32 , 04-Авг-05 (10)
                    идея такая: скрипт получает из коммандной строки список каталогов, которые он потом обходит и выводит все файлы и каталоги, кот. содержаться в заданных каталогах. если скрипт запускается без аргументов, он считает, что нужно сделать работу для текущего каталога. итак, если скрипт вызывался со списком каталогов в коммандной строке, этот список будет содержаться в @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).


                    • Помогите разобрать код, !*! Sereg, 18:11 , 04-Авг-05 (11)
                      Спасибо, многое прояснилось, однак
                      @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
                      Может подскажите чего?





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

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