| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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
работает! это было только в пусковом |