Помогите новичку разобраться что делает эта строка:
@ARGV = qw(.) unless @argv;
желательно поподробнее..
если масив @argv пустой, или не существует, @ARGV станет одноелементым массивом, единственный елемент которого -- '.'
А этот массив argv - для чего он вообще предназначен? И какой смысл в этом присваивании если эта строка стоит в самом начале кода? Сорри за глупые вопросы..
@ARGV -- это массив, в который записываются аргументы коммандной строки, с кот. запускался перловсий скрипт. @ARGV и @argv - разные переменные. @argv может быть определён где - то в другом месте. до использования @argv есть директивы require?
Пардон, Ihor, за задержку. Вот полный код:
open(log1,'>log1');
@ARGV = qw(.) unless @argv;
use File::Find;
find sub { print log1 $File::Find::name, -d && '/'. "\n"}, @ARGV;
close(log1)
Программка записывает в файл имена всех файлов и подкаталогов. Одна проблемка: все имена файлов подкаталога пишутся сплошной строкой, а как сделать на каждый файл отдельную строку шот мозгов не хватает...
по всей видимости, имелось в виду вот что:
# =======================================
open(log1,'>log1');
@ARGV = qw(.) unless @ARGV;
use File::Find;
find sub { print log1 $File::Find::name, -d && '/', "\n"}, @ARGV;
close(log1)
# ======================================
но стиль -- жуткий(IMHO)
Дык, может подскажете как сделать печать каждого файла в отдельной строке?
вот то, что я написал, уже с нужными исправлениями
Сразу 2 вопроса:
1. Я так понял из Ваших объяснений во второй строке создаётся одноэлементный массив ARGV и $ARGV[0]='.'? А почему нельзя вставить qw(a)? Пишет не могу найти путь или директорию?
2. Далее в 4-й строке ....."}, @ARGV - что это означает? Почему, допустим, без @ARGV программа не работает?
3. И на последок: как сделать, что бы имена файлов выводились с полными относительными путями?
Кстат, оказывается под виндой с этой задачей отлично справляется
dir /s /b > log
идея такая: скрипт получает из коммандной строки список каталогов, которые он потом обходит и выводит все файлы и каталоги, кот. содержаться в заданных каталогах. если скрипт запускается без аргументов, он считает, что нужно сделать работу для текущего каталога. итак, если скрипт вызывался со списком каталогов в коммандной строке, этот список будет содержаться в @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).
Спасибо, многое прояснилось, однак
@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
Может подскажите чего?
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, который лежит в текущем каталоге, так что это разные файлы. может, я вопрос не понимаю?
Запустите под виндой
dir /s /b > log
В log как раз то, что мне нужно. Мне интересно есть что-то более менее стандартное в перле для получения такого файла?
Огромное спасибо, Ihor, всёполучилось.