Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > ООП в perl |
Автор: DEER 16.11.2005, 12:23 |
Народ, я слышал что в perl можно создавать классы, хотелось бы узнать как? если можно маленький пример, класса скажем с двумя полями, и одним методом, который складывает эти поля и возвращает сумму ![]() Заранее спасибо |
Автор: arto 16.11.2005, 13:00 |
perldoc perltoot |
Автор: korob2001 16.11.2005, 13:08 | ||||
Вобщем написал тебе такой вот тестовый класс. Сохрание его под именем Sum.pm
Тепрь в тот же каталог, сохрани следующую программу, под любым именем лишь бы расширение было как у выполняемого файла, как правило это .pl или .cgi. Я назвал его test.pl
Ну и читай коментарии, там всё пояснено. Если чего-то не поймёшь, спрашивай. |
Автор: DEER 16.11.2005, 13:33 | ||||||
Спасибо! Я так понял, что внутри каждого метода мы получаем доступ к классу(его методам и всойствам) через shift. Так? Тогда можно сделать так? то есть внутри класса вызывать его методы?
также можно объявить именованное свойство в конструкторе
и тогда для этого свойства нужно описать функцию
Так? |
Автор: korob2001 16.11.2005, 14:03 | ||||||
Ты почти всё верно понял, но shift всеголишь вытаскивает первый елемент массива и возвращает его.
Теперь переменная $color содержит строку "red", а массив @color содержит теперь 2 елемента "green" и "blue". Вобщем игра со стёком. В нашем случае, мы не указываем имени массива из которого нужно извлекать первый елемент, если массив не указан и shift находится внутри подпрограммы, то будет извлечён первый елемент массива @_, если shift вне подпрограммы и не указан явно массив, то будет извлечён первый елемент массива @ARGV. Т.е. когда ты вызываешь метод, первым параметром всегда является объект. Это легко проверить. Добавь такой метод в класс Sum.pm
Ну и конечно же вызови его из основной программы. Увидишь примерно такую строку: Sum=ARRAY(0x2252f8) где Sum имя пакета, а ARRAY(0x2252f8) ссылка на анонимный массив, в нашем случае в нём сохраняются члены класса. Мы его создаём в конструкторе. Внутри класса можно обращаться к методам и напрямую, указав его имя, но всё же рекомендуется обращаться через обьект, потому мы сначала извлекаем объект с помощью shift, ну а затем через него обращаемся к методам. Кстати можно создавать закрытые методы, для этого нужно, что бы имя метода начиналось с символа _ :
Можно так же реализовать закрытость ещё более надёжную, если заключить члены в блок (т.е. в фигурные скобки ) и объявить их как локальные, через my. |
Автор: DEER 16.11.2005, 14:14 |
Угу почти понятно ![]() Спасибо! |
Автор: korob2001 16.11.2005, 14:25 |
Ну вообще-то ООП, тема довольно не маленькая, но очень затягивающая. Очень хорошо она описана в книге "Программирование на Perl" Ларри Уолл, Том Кристеасон, Джон Орвант. Она помоему есть в нашей библиотеке, посмотри. Ну а так же поищи через поисковик, здесь уже много раз поднимались подобные темы. |
Автор: korob2001 16.11.2005, 15:30 | ||||||||
Гость_Nick - главное спокойствие. Отрываем "Perl - специальный справочник" Стивен Холзнер (страница 357) и читаем. Создание приватных методов и данных Хотя многие объектно-ориентированные языки программирования поддерживают приватные методы и переменные ( то есть внутренние методы и переменные, не достижимые вне класса или объекта ), Perl не позволяет делать этого явно. Вы всегда можете использовать переменные с лексической областью видимости (ключевое слово my), что бы ограничить область видимости переменных текущим пакетом. Что бы создать приватные переменные, надо воспользоваться следующим соглашением Perl: приватные имена начинаются с символа подчёркивания. В отличии от языков типа C++, Java или Delphi, это не значит, что вы не може получить доступ к приватным переменным и методам объекта. Идея состоит в том, что если имя начинается с символа подчёркивания, его не следует использовать, поскольку оно считается приватным. В следующем примере публичный ( открытый ) метод sum исплользует приватный ( закрытый ) метод _add для сложения двух велечин:
Вот результат использования метода sum:
Собственно это я и имел ввиду. Ну а так, можно создать истенно закрытый метод:
Или даже так, ещё больше закрытый:
Я так и не понял твоего сорказма, будь добр поясни. |
Автор: Гость_Nick 16.11.2005, 16:17 | ||||||||||
А почему я своего сообщения не вижу? И язык у меня не козлиный... Я только после того как отправил сообщение увидел, что ты модератор ![]() Вообще в конце того сообщения хотел извиниться, но передумал, т.к. ну не перевариваю я когда люди толком не знают неких вещей а сообщают об этом как большие знатоки, ну сори... ![]() ![]() А что касается закрытых методов, ты пишешь
Прочитай внимательнее ту цитату, которую приводишь в качестве контр аргумента:
Но по твоему выходит, что позволяет: ибо использование "_" для закрытия метода есть не что иное, как явное указание Perl'у на то что метод закрыт.
Это просто соглашение и не более. Т.е. на самом деле метод не является закрытым. Хочешь сделать закрытый метод, можно, например, так:
Использование:
Но опять же это не будет в полной мере приватный метод в понимании C++. Т.к. С++ компилятор будет ругаться на неправильное использование методов на стадии компиляции, а Perl это все проглотит и будет ругаться только на стадии исполниния, что чревато. |
Автор: korob2001 16.11.2005, 16:33 | ||
Гость_Nick - ты меня тоже извини, я тоже какой-то злой сегодня. Может погода влияет? Вобщем каждый из нас обратил внимание на то, что ему хотелось. Я собственно назвал этот метод приватным потому что раздел в книге называется: Создание приватных методов и данных, с другой стороны я так же сказал:
Пример этого способа привёл постом выше. Зы: ты случайно NICK не с perl.ru, я имею ввиду 2001 год? |
Автор: Гость_Nick 16.11.2005, 16:48 |
Ну разобрались и ладно. ![]() ЗЫ: Я не с perl.ru и вообще ниоткуда ![]() ЗЗЫ: Я вообще очень редко бываю на каких-либо форумах, сегодня случайно забрел и не удержался от ответа. ;) |
Автор: Kiber_rat 18.11.2005, 14:50 |
Может кому пригодится... Я тут читаю книжку "Perl best practices" by Damian Conway (есть у меня в виде html) там есть много полезного, в частности и по поводу ООП в perl. Так что рекомендую. Язык - родной англицкий ![]() |
Автор: DEER 30.11.2005, 11:55 | ||
Господа, а нет тонкостей(или разностей) написания классов под windows\linux? просто написал класс, отлаживал под винды, а сейчас пытаюсь запустить всё это дело под linux'ом, он говорит
соответственно deer.cgi и Analisyst.pm лежат в одной директории ![]() |
Автор: Kiber_rat 30.11.2005, 17:11 |
В *nix имеет значение регистр символов, т.е. Analisyst и analisyst - разные файлы, прежде всего проверь это ![]() |
Автор: sharq 30.11.2005, 17:43 | ||
DEER а ты в deer.cgi указал
Проверь это! ![]() |
Автор: DEER 30.11.2005, 17:58 |
спасибо что ответили, с десятого раза всё заработало..... как то странно, но ничего в коде не менял.... sharq нет не написал. так работает, причем ошибка только с этим модулем была.. там ещё мои модули есть, с ними было всё в порядке А кстати если так написать, он будет видеть другие модули, которые не мои, которые лежат в /usr/perl/bin ?? |
Автор: sharq 30.11.2005, 18:25 | ||||||||||||
DEER
означает, что модули будут искаться в текущей директории. Хотя по умолчанию в массиве @INC , указана текущая директория, это пишется для уверенности. ![]() Массив @INC содержит все пути к модулям, чтобы узнать какие именно, можешь сделать следующее:
И как видишь пути
![]() Чтобы добавить новый путь к данному массиву, можно написать
или явно
![]() |
Автор: DEER 1.12.2005, 09:38 |
Спасибо |
Автор: gcc 29.8.2008, 14:27 | ||
perl в режиме cgi/fcgi есть код в который нужно вносить изменения и оптимизацию, класс должен заканчиваться на
если ошибка в коде, и если он заканчиваеться не верно, то вебсервер возвращает ошибку 500 use CGI::Carp qw(fatalsToBrowser); не помогает вожно сделать чтобы он писать ошибку в браузер, а то очень не удобно ходит через ftp и смотреть ![]() ![]() может mod_perl нужен, но ставить его не хочеться... |
Автор: nitr 29.8.2008, 14:31 |
gcc, при чем тут эта тема? Что вы этим хотели сделать? На первое время достаточно use CGI::Carp qw(fatalsToBrowser); Или что-то свое сделать, хотя на спане есть готовые. |
Автор: gcc 29.8.2008, 14:35 | ||
написал в .pm
работает! это было только в пусковом |