URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4541
[ Назад ]

Исходное сообщение
"Помогите разобрать код"

Отправлено Sereg , 03-Авг-05 17:52 
Помогите новичку разобраться что делает эта строка:
@ARGV = qw(.) unless @argv;
желательно поподробнее..

Содержание

Сообщения в этом обсуждении
"Помогите разобрать код"
Отправлено ihor , 03-Авг-05 18:03 
если масив @argv пустой, или не существует, @ARGV станет одноелементым массивом, единственный елемент которого -- '.'



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


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


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

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


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


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



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


"Помогите разобрать код"
Отправлено Sereg , 04-Авг-05 15:09 
Кстат, оказывается под виндой с этой задачей отлично справляется
dir /s /b > log

"Помогите разобрать код"
Отправлено ihor , 04-Авг-05 15:32 
идея такая: скрипт получает из коммандной строки список каталогов, которые он потом обходит и выводит все файлы и каталоги, кот. содержаться в заданных каталогах. если скрипт запускается без аргументов, он считает, что нужно сделать работу для текущего каталога. итак, если скрипт вызывался со списком каталогов в коммандной строке, этот список будет содержаться в @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 , 04-Авг-05 18: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
Может подскажите чего?



"Помогите разобрать код"
Отправлено ihor , 04-Авг-05 19:09 
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, который лежит в текущем каталоге, так что это разные файлы. может, я вопрос не понимаю?


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


"Помогите разобрать код"
Отправлено Sereg , 05-Авг-05 11:00 
Огромное спасибо, Ihor, всёполучилось.