![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
Добрый день, уважаемые посетители!
Представляю на всеобщее обозрение свой первый модуль ( что он первый это не совсем верно, но это тут ни причем ). Я с первого дня програмирования на Perl не пользовался модулем CGI.pm, многие меня укоряли за это, кто-то хвалил, но данный поступок был сугубо личным... хотелось бы попросить не обсуждать тут, что-то вроде "пользуйса CGI.pm и не мешай нам жить". Перед написанием модуля, были просмотрены CGI.pm, cgi-lib, другие реализации, но основным источником конечно являются специйикации RFC ( если кому интересно, можете почитать RFC 2388 и дальше по тексту ). Что делает модуль?
Вы можете скачать с моего сайта Black::CGI.pm, тут не выкладываю, чтобы всегда была последняя версия модуля. Как использовать модуль? Примеры Последняя версия документации Black::CGI.pod
Хотелось бы услышать Ваши отзывы, рекомендации, пожелания по работе модуля. Если кому интересно, можете присоединиться! Заранее благодарен за любые комментарии! Это сообщение отредактировал(а) BlackLFL - 18.3.2008, 13:48 |
|||
|
||||
sharq |
|
||||||||||||||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 2 Всего: 28 |
Это очень бегло и только по коду,
не тестировал, не сравнивал... 1. Если это готовый модуль, то из модуля необходимо убрать строки:
2. Ключи хеша бери в кавычки, т.к. возможно у тебя будет функция с одноименным названием и произойдет ее вызов. 3.
можно написать короче
или
4.
избавляйся от лишних скобок 5.
6.
Эта часть кода повторяется несколько раз. 7. Это должно вызываться автоматически, т.е. деструктором
8.
Это лишняя строка, т.к. по умолчанию модули ищутся в текущей директории. В принципе, хорошо написано, не останавливайся на этом, продолжай совершенствоваться, удачи. ![]() -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||||||||||||||
|
|||||||||||||||||||
BlackLFL |
|
||||||||||||||||||||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
модуль не закончен, когда выйдет первый релиз, уберу.
Спасибо, приму к сведенью!
об этом я конечно знаю, написал пошагово, чтобы начинающим програмистам было более понятно.
забыл убрать ![]()
вывел в отделную функцию.
Вы правы, многие могут забыть ... сделал деструктор.
Спасибо, не знал!
Спасибо за коментарии!! |
||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
BlackLFL |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
добавлен метод получения содержания файла
CGI.pm
Это сообщение отредактировал(а) BlackLFL - 14.2.2006, 11:56 |
||||
|
|||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
как Вы считаете, лучше ли использовать read для чтения бинарных файлов?
в функции receive_file вместо
Это сообщение отредактировал(а) BlackLFL - 13.2.2006, 12:32 |
|||
|
||||
korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Привет!
Я весь модуль не смотрел пока, но по последним постам есть несколько пожеланий: Почему для именования дескриптора файла не используешь прописные символы? Это конечно не обязательно, но всё же это общее соглашение, хотя и не писанное. А так же совсетую объявлять typeglob в теле подпрограммы, как локальный, перед использованием дескриптора:
Или позволь Perl'у именовать дескриптор самостоятельно.
Хотя я всё же предпочитаю делать это первым способом, наверно просто привык. ;))))) -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
BlackLFL |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
Привычка была писать маленькими буквами, исправил ![]()
Объявил, хотя думаю это было необязательно делать, всеравно сразу закрывал дескриптор, а навание было коректным ![]() Спасибо за коментарии! |
||||
|
|||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
добавлена проверка на переполнение временной папки
|
|||
|
||||
Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 1 Всего: 9 |
Возможно кто-то посчитает это не важным, но тем не менее
![]() Желательно код форматировать так, что бы он вписывался в 80 символов на строку. Во первых, большинство perl программистов работают в *nix, и как следствие в vi, да и на удаленной машине используется vi, а там 80 символов - наиболее комфортно. Ну и все таки это негласное соглашение по форматированию ввода, такое же как отступ в 4 пробела (а не в символ табуляции) и т.п. Второе. Кодировка комментов win1251, опять таки, модуль будут использовать чаще всего на *nix серверах, и прочитать там комменты без перекодировки невозможно... Надеюсь что мои "придирки" не лишние ![]() -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 2 Всего: 28 |
Kiber_rat, согласен, кроме
Очень внимательно прочти perldoc perlstyle! ![]() -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
Phoinix |
|
||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 16.11.2004 Где: Moskau Репутация: 1 Всего: 2 |
BlackLFL,
Пробегусь беглым взглядом... 1. Если уж я включаю модуль CGI в скрипт, то значит переданные данные я буду использовать в любом случае, поэтому метод parse - лишний, точнее его следовало бы запускать во время создания объекта в процедуре ew модуля; 2.
Поменять на
Этого будет достаточно 3.
Ну очень некрасиво... и дальше тоже, я смотрю, такая же песня... 4. В продолжение п.3... ой... а что вообще за паровоз с разделителем? Не проще ли?
5.
Сразу "двойка" за код... это даже не смешно... 6.
Поверь... методом GET особо много не передашь и без твоих проверок... не помню какой RFC 7.
Что-то я не понял смысл этого кода...
8. Метод remove используется только в DESTROY... собственно, а зачем он отдельно? |
||||||||||||||||
|
|||||||||||||||||
BlackLFL |
|
||||||||||||||||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
учту
учту спасибо!! я хотел сделать полное управление процессом, но замечание хорошее... может дать дополнительную возможность при создание объекта, если передан аргумент parse, производить разбор? например:
Спасибо, очень дельное замечание! Я постарался упростить код, чтобы новичкам было лекго в нем разобраться, меня такая конструкция устраивает ![]()
Сейчас Вы допустили очень серъезную ошибку, операционные системы поразному отображают перенос строки, надо указывать код символа \x0D\x0A Паровоз построил, чтобы было понятно, как разбирать тело запроса по шагам, но замечание опять хорошее (про поровоз), думаю в будущем я от него избавлюсь, и напишу просто комментарии ![]()
Только вчера заметил, хотел убрать, опередили ![]()
Я об этом знаю, но лучше перестрахуюсь ...
Если передано два поля с одним именем, чтобы не затереть первое значение, мы создаем хэш массива Потом обращаемся к нему через индекс
Не только, я забыл задокументировать, что если его вызвать с аргументом
то будут удалены все файлы из временой директории, например те, которые были созданы сторонними програмами ... Спасибо за комментарии!!!!! Это сообщение отредактировал(а) BlackLFL - 17.3.2006, 12:46 |
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
Phoinix |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 16.11.2004 Где: Moskau Репутация: 1 Всего: 2 |
Тебе что нужно? полное управление процессом или все-таки данные разобрать?
Насчет кодов символов - не буду спорить, хотя я не согласен, коды здесь не при чем, перенос строки может быть либо \n, либо \r либо \r\n, хотя изменить рег - не сложно, и если ты заметил, мой рег выбирает и код переноса строки ($end), что бы его можно было в дальнейшем использовать в split. Насчет новичков - а ты не спрашивал их знают ли они в каком виде получаются данные? Если я этого не знаю, то твой код ничего мне не объяснит... А мой рег, не настолько сложен для разбора... Вообще, сложилось мнение, что ты просто не знаешь как его упростить, извиняюсь если не прав, но рег должен быть такой:
Остальные - в том же ракурсе... Это перестраховка? Хм... кстати, только сейчас заметил насчет твоих перестраховок - почитай, чем отличается || от or и сделай выводы... особенно когда файлы открываешь...
И зачем? У тебя модуль данные разбирает или чистит файлы? тем более можно случайно удалить лишнее... у тебя есть в объекте список полученных файлов, вот их и удаляй... |
||||||||
|
|||||||||
BlackLFL |
|
||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
разве не может быть случая, когда ненадо разбирать данные, а просто нужно получить даныне объекта? думаешь лучше все-таки разбирать сразу?
если мне не изменяет память, обсуждалось это на Xpoint... пришли к выводу, что лучше код символа указывать ...
Я знаю как упростить, хотел в таком стиле написать ... на работоспособность это не влияет, но за замечание спасибо, изменю.
Все в порядке, я сам просил дать комментарии, любой вправе предположить ![]()
В приоритете ... Вы правы, я слишком намудрил ... сделал так
Например, если временная папка переполнена сторонними файлами, а указать другую нет возможности. Я в коментариях написал
Спасибо за комментарии!! Это сообщение отредактировал(а) BlackLFL - 17.3.2006, 12:45 |
||||||||||||||||
|
|||||||||||||||||
Phoinix |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 16.11.2004 Где: Moskau Репутация: 1 Всего: 2 |
Вот честно, думаю, думаю, а зачем мне данные объекта? Никак не приложу ума нафиг они мне нужны... Еще: Я что-то не пойму а методом POST передаются только типы данных: application/x-www-form-urlencoded и multipart/form-data??? Честно говоря, не буду проверять, но я часто POST'ом передаю и обычный text/plain (например: в TEXTAREA большой текст)...
IMHO метасимвол на то и метасимвол, а жеский код указывать - только увеличивает вероятность несоответсвия... но это совершенно другая тема...
Ну так надо сделать алгоритм, который проверяет, переполнена папка или нет, и в случае чего чичтить их, если указан, скажем, какой-либо ключ при инициализации объекта... И еще: В своих скриптах я часто использую некоторые переменные которые постоянно передаются между пользователем и сервером, например, уникальный ключ сессии, так вот этот параметр проверяется сразу при запуске скрипта, а передаваться он может как POST'ом так и GET'ом... А ты взял и разделил данные... Если честно, то это сделано по типу PHP и мне такая реализация ну совсем не нравится, при использовании PHP мне приходится делать двойные проверки... А смысл? Я лично не могу себе представить, что буду одновременно передавать разные(!) данные под одним и тем же именем, но разными методами... |
||||||
|
|||||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Да, но порой очень важно разделить методы передачи данных. Просто нужно добавить возможность и их совместного использования, для передачи тех же ключей сессии, так как сессия должна сохраниться не в зависимости от метода передачи данных. Это сообщение отредактировал(а) korob2001 - 18.3.2006, 11:47 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
BlackLFL |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
посмотрел еще раз стороние реализации, нигде не нашел, всегда разбираются данные, при создание экземпляра ... так что наверно я перестарался ... сделал разбор сразу ...
хорошая идея, добавил параметр clear_temp_folder, метод сделал приватным. Поумолчанию функция очистки отключена ...
согласен с korob2001, методы должны быть разделены ...
я сейчас подумаю как это реализовать ... есть идеи? |
||||||||||
|
|||||||||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Можно добавить метод который смешивает оба хеша и возвращает ссылку на новый анонимный хеш. Я назвал бы его param:
C другой стороны это пожалуй далеко не лучший вариант. Можно получать в методе param имя параметра, проверять оба метода и возвращать value.
Хотя мне кажется парвильнее делать вот такую проверку:
Это сообщение отредактировал(а) korob2001 - 19.3.2006, 03:06 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
BlackLFL |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
ты читаешь мои мысли, ночью тоже самое приснилось
![]()
следовательно
исходя из твоего предложения, мы неполучим ничего ... может лучше все-таки воспользоваться вторым вариантом?
в этом случае мы получим значение GET 73427842742 как ты думаешь? p.s. приоритет наверно за POST оставим? |
||||||||
|
|||||||||
korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Почему?
А как же быть с параметром prm=0 ? -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
об этом я и не подумал ... тогда делаем окончательный вариант
поддерживаешь? ты так и не ответил про приоритет ... |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Ну пока лучшего варианта в голову не приходит, так что можно добавить, если будет лучший вариант то никогда не поздно подправить. Оставляй приоритет за post, хотя думаю это не столь важно, так как нельзя заранее предугадать какой из методов будет использоваться чаще. Вот ещё как вариант:
Это сообщение отредактировал(а) korob2001 - 19.3.2006, 15:21 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
модуль обновился до версии 0.2
Еще раз выражаю огромное спасибо всем, кто принимает участие в тестирование модуля, высказывают свои пожелания и замечания! В новой версии модуля оптимизированы отдельные фрагменты кода, исправлены мелкие недочеты. Добавлены примеры работы с модулем. Это сообщение отредактировал(а) BlackLFL - 17.4.2006, 11:06 |
|||
|
||||
BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
модуль обновился до версии 0.3
Еще раз выражаю огромное спасибо всем, кто принимает участие в тестирование модуля, высказывают свои пожелания и замечания! В новой версии модуля оптимизированы отдельные фрагменты кода. Это сообщение отредактировал(а) BlackLFL - 21.2.2007, 20:57 |
|||
|
||||
ochnev |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 253 Регистрация: 27.3.2006 Репутация: нет Всего: нет |
А почему из готового модуля нужно убирать "use strict"?
|
|||
|
||||
Nab |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Убирать не обязательно, просто в готовом отлаженном модуле она не нужна... какуюто, хоть и не большую но явно лишнюю нагрузуку он создает. А если весь код отлажен, то почему бы не убрать?.... BlackLFL, я давно приглядуюсь к Вашему модулю, но честно сказать не особенно вижу каое будущее Вы ему готовите ![]() Ведь его получается можно использовать только в новых разработках, заменить им, более легким, CGI.pm в старых проектах не представляеется возможным, слишком трудоемкий процесс получиться ![]() ![]() Просто я сейчас разрабатываю достаточно оьбъемный проект, и там как базовая возможность по работе с cgi - окружением используется именно CGI.pm. Так было задумано не мной, но я вполне поддержую эту стратегию, потому как этот модуль есть практически везде... И что более важно, к нему есть расширения, и альтернативы. Расширение типа CGI::Compress::Gzip, позволяют очень просто добавить к своему приложению gzip сжатие, что сейчас и востребовано и необходимо и все чаще используется... А альтернативы, это в первую очередь CGI::Simple, сравнение по скорости можно глянуть вот здесь http://search.cpan.org/src/JFREEMAN/Cgi-Si..._vs_cgi-pm.html . Также есть еще CGI::Minimal, для работы с параметрами очень даж не плох, но необходимой мне совместимости не имеет ![]() Есть еще некоторые альтернативы, но они менее совместимы... Я это все к тому, что, если бы Ваш модуль, предоставлял интерфейс более совместимый с CGI.pm, пускай и не в полном объеме, то количество пользователей и и широта использования думаю выросли бы ... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 1 Всего: 4 |
Потестил, нашел баг.
В $ENV{'CONTENT_TYPE'} не всегда передается только строчка application\/x-www-form-urlencoded, поэтому при таком условии:
запрос не обрабатывается. Надо бы поставить регексп, как в условии для multipart/form-data --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
BlackLFL |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 3 Всего: 12 |
Спасибо подправил. Добавлено @ 11:18 2Nab, прошу прощения за долгий ответ, не было возможности ответить сразу, а потом забыл :( Полностью с Вами согласен, функционал отличается кардинально, сам столкнулся с интеграцией в большой проект ...
На самом деле, модуль содержит минимальный набор методов для работы с CGI, а если нужны дополнительные возможности, можно будет подключить внешние модули ...
Бесспорно, минус, но не для всех проектов, например, для внутренний разработок, он не нужен ИМХО.
Интерфейс делал похожий на PHP, т.к. на мой взгляд там он более наглядный ... Спасибо за конструктивную критику! Это сообщение отредактировал(а) BlackLFL - 30.8.2007, 11:19 |
||||||||||
|
|||||||||||
Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 1 Всего: 4 |
Нашел хитрый баг!
Если на серваке ограничено количество оперативной памяти для cgi-скрипта, то при загрузке данных от 4 мб. случается хватка памяти. Приношу свои извинения! Это у меня в скрипте какая-то утечка.. Это сообщение отредактировал(а) Vaneska - 8.4.2008, 11:52 --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |