Forum Webscript.Ru
Программирование => Perl => Тема начата: erl от 16 Мая 2007, 06:56:22
-
Здраствуйте Все !
Скажи те гуру перла, как реализовать вот такой подход:
есть изначально текстовый файл который необходимо обработать. В этом текстовом файле я как писатель скрипта изначально не знаю формат, таких различных файлов может быть множество. Есть скрипт который должен все это обрабатывать перобразовывать и записывать куда нить. В этом и сложность задачи, что заранее не известно ни формата файлов, ни что с ними делать - отсюда вывод отдать все на откуп, того кто знает формать и как его разбирать, забирать у человека такой инструмент как перл, выдумывая свои универсальные обработчики - это кощунственно. Поэтому принято решение пусть тот кто знает формат сам пишет программу(модуль, пакадж и т.д.) по обработке этого только ему известного файла.
Теперь вопрос: я не знаю ни формат файла, ни того как его обрабатывать, не знаю какие процедуры будудт использованы для обработки файлов, мне нужно предложить каое то решение , согласно которому, можно будет подключать к моему скрипту основному который всегда выполняется, скрипты которые напишут те люди которые будут обрабатывать текстовые файлы (их скрипты могут делать следующее взять конкретный файл и его преобразовать сохранив результаты), далее их скрипты завершаются и продолжается выполнение моей программы далее пока все текстовые файлы не будут обработаны.
и блин самый простой вопрос который можно только себе представить , как это сделать на perl?
С уважением,
Erl.
-
perldoc -f open
-
if (если это) {require файл с кодом}, где в файле с кодом определенный метод обработки файлов.
-
xmolex:
if (если это) {require файл с кодом}, где в файле с кодом определенный метод обработки файлов.
А вот с этого мета можно по точнее, плиз...
вот в файле с кодом обработки что необхордимо написать ... это должна быть конструкция , типа:
Sub Name_SUB
{
.... мой код
}
или что то другое ????
плиз уточните очень нужно !!!
-
xmolex:
if (если это) {require файл с кодом}, где в файле с кодом определенный метод обработки файлов.
И еще, один ворпос ?
Этот файл просто текстовый файл или у него должен быть определенный формат ...
-
В файле с кодом обработки вы можете написать подпрограммы, а можете кусок кода. Писать #!/usr/bin/perl не надо.
Там где вы напишете require, в то место просто вставится код из файла, который вы укажите. Файл не специфичный, обычный кусок кода.
Если у вас в файле 1.pl, всего одна строка print "Hello";,
то там где вы выполните require, выполнитеся код print "Hello";, соответственно выведется Hello.
-
erl:
Теперь вопрос: я не знаю ни формат файла, ни того как его обрабатывать, не знаю какие процедуры будудт использованы для обработки файлов, мне нужно предложить каое то решение
делаешь спецификацию на интерфейс модуля/класса - мол каждый разработчик должен будет свою поделку оформить соответствующим образом и там обязательно будут процедуры A, B, C - ты знаешь что подавать им на вход (например строку или файл) и знаешь что они тебе возвратят (например хеш с разобранными параметрами)
ну и тебе остается подгружать эти модули и вызывать эти процедуры (а процедуры у всех одни и те же по названию и входным/выходным данным)
-
Green Kakadu:
делаешь ..... модули и вызывать эти процедуры (а процедуры у всех одни и те же по названию и входным/выходным данным)
Да я все это понимаю ...
все я получил ответ на свои вопрос , мне этого достаточно, я все понял ... БОЛЬШОЕ СПАСИБО, ГУРУ ПЕРЛА!!!
-
Привет !
Вот через пол года пришлось мне вернуться к теме
вот создал я коl
@list = qw(/home/user/perl/p1.pl)
for(i=0;i<10;i++)
{
require $list;
}
все работает один раз когда подгружается модуль p1.pl, а когда необходимо еще раз его использовать он не выполняет его ...
в описании require написано верно что типо подгружаемый модуль будет выполнени всего один раз на момент загрузки, но я не увидел(не заметил - уж тыкнете носом не поленитесь), где написано как его повторно перезапусить на выполенние?
-
блин поправлюсь чуствую что фигню написал
#ссылка на хэш в котором прописаны пути к исполняемым модулям
%$ref_mask_body_parser
$value_mask_body_parser - в переменной записано "/home/user/perl/p1.pl", "/home/user/perl/p2.pl" "/home/user/perl/p3.pl"
foreach $value_mask_body_parser (values %$ref_mask_body_parser)
{
require $value_mask_body_parser
}
при запуске все работает только один раз ...
при повторной обращении на выполнение p1.pl, ни чего не выполняется?
еще раз, как повторно в ходе выполения основного скрипта, еще раз запустить на выполение дополнительный p1(1,2,3).pl ?
-
%INC
-
arto
Извиняюсь, я не понял , по подробней можно !
я понимаю что в э том хэше складываются все загруженные модули, как его выташить я тоже понимаю , $INC{\'filename\'}, как его повторно выпонить не понимаю ... ?
-
# cat > aa.pm
package aa;
print STDERR "call aa\\n";
1;
^D
# print -e \'require aa; require aa; delete $INC{"aa.pm"}; require aa;\'
call aa
call aa
#
-
я туповатый тугодум, и опыта у меня маловата, спасибо....!
все вроде начало получаться ... !
Я думал что нужно удалять подгруженный модуль, но не знал как, еще раз удивляюсь PERL какое простое решение ...
Спасибо !!!
-
Со скрипом пишу. вижу што умничаю через чур, вы уж простите
Вобще require помоему какоето некрасивое и неправильное решение.
Лучше бы разбить решение на *управляющий скрипт* и *скрипты конверторы* все будет выглядеть логичней и красивее.
функции *управляющего скрипта*:
1) формирование листинга
2) инициализация исходной конфигурации работы скрипта
3) запуск *скриптов конвертеров*/*внешний вызов*/
4) ведение лога выполнения
если какоето время с этим помучится можно запускать *скрипты конверторы* отдельным потоком или процессом /*пока путаюсь в определении*/
и если дописать к этому решению возможность конфигурирования через интерфейс взаимодействия с пользователем. будет вобще красиво
-
на каждую обработку свой форк?