![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Народ, а не мог бы кто-нибудь простыми словами рассказать, как организована работа с классами на Perl? Мне сейчас нужно написать веб-приложение, я в сомнении, PHP иль Perl. В последнее время стал неравнодушен к Perl'у, ну нравится мне он.
![]() Если не трудно, покажите, пожалуйста, пример. Допустим, класс с конструктором и каким-нибудь одним методом типа getHelloWorldString(). Ну и плюс код, к-й создает объект такого класса. Пробовал поиск по форуму или FAQ - без результатно. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
ОК. Давай напишем класс HelloUser
Сохрани код класса в файл HelloUser.pm Имя файла должно совпадать с именем пакета с точностью до регистра. Можно было бы конечно упростить всё, но цель этого кода показать что есть класс, а не ввести в заблуждение. Так же здесь был, специально, создан закрытый метод _name_pp, который нельзя вызваьть из вне, да бы показать наглядно инкапсуляцию в Perl. Теперь давай попробуем создать создать файл hello.pl, в котором можно будет посмотреть на интерфейс нашего класса. Внимание оба файла сохраняй в один каталог. Вот код:
Тепь попробуй поэксперементировать с методом add_user, попробуй передать другие свойства или не предать их вообще. Можно было бы показать более наглядный пример, потому как в этом коротком примере не рассмотренны такие концепции как наследование, перегрузка операторов и т.д. Но эта тема довольно сложная и объяснить её в двух словах не получится. Потому могу посоветовать тебе несколько книг, где эта тема хорошо описана. 1. Программирование на Perl ( Лари Уолл, Том Кристиансен, Джон Орвант ). 2. Perl Библиотека программиста ( Том Кристиансен, Натан Торкингтон ). 3. Perl Специальный справочник ( Стивен Холзнер ). Третья книга у меня есть как в оригинале, так и в формате .doc, на русском языке, если нужно, могу выслать. Удачи. ЗЫ: Если возникнут вопросы, пиши сюда. Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:58 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
Kurt |
|
||||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Не мог бы ты прокомментировать эти строки? Что такое shift? Для чего тут ref? Что такое bless?
Может, лучше зальешь на FTP-сервер? ![]() -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||
|
|||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Это конструктор. Для наглядности я пронумеровал строки. 1. Здесь мы с пощью shift извлекаем первый параметр из массива @_, через который в подпрогрмму передаются параметры. На самом деле можно было бы написать эту строку так: my $check = shift( @_ ); или так my $check = $_[0]; новсеже последний пример отличается от тех, где используется shift тем, что когда мы извлекаем нулевой элемент с почощью shift, то массив из из которого мы извлекли этот элемент, уменьшается. Другими словами мы как бы вырезали нулевой элемент и сохранили его в переменную. Способ извлечения параметров с помощью индекса $_[0], поросто копирует значение нулевого элемента массива @_ . 2. В этой строке мы узнаём каким способом юзер создал объект, например можно создать объект так: my $hello = new HelloUser; а можно и так: my $hello = HelloUser->new(); Допустим если у тебя в программе есть подпрограмма с именем new, то первый способ не создаст объекта, а будет просто вызванна подпрограмма new в текущем пространстве имён, вот тут на на помощь приходит второй способ. Для того, что бы отличить как же всё-таки был создан обект, мы и используем функцию ref(), которая возвращает истинну в том случае если переданный ей параметр является ссылкой, возвращаемое значение зависит от типа того, на что указывает ссылка. (если переданный параметр освящен в пакет, то ref() возвращает имя этого пакета в качестве истенного значения), в противном случае ЛОЖЬ. Т.е. мы присваиваем переменной $class имя класса если она является ссылкой (второй способ создания объекта), в противном случае мы присваиваем ей имя класса ( первый способ создания объекта). Мы как бы предусмотрели то, что юзер может создать объект двумя способами: a.) Косвенный. б.) Стрелочный. Что бы было более понятно, покажу более длинный, но более понятный код:
Думаю такой код будет более понятен для программиста на другом языке, он абсолютно идентичен такому коду, какой использовал я во второй строке. 3. Создаём анонимный хеш, собственно в нём и хранится вся информация. Изначально он пустой. 4. Эта строка действительно интересна. Здесь происходит посвящение ( blessed ), другими словами мы посвящаем данный экземпляр класса или метода в объект, т.е. мы как бы даём Perl команду - воспроинимать анонимный хеш $self, как объект класса $class. 5. Возвращаем уже сконструированный объект.
На какой???? Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:19 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
смотри тут ![]() Внешне все понятно. Будем эксперементировать. Спасибо за помощь. Но, похоже, я еще не раз вернусь к этому топику. ![]() Добавлено @ 04:22 Кстати, неплохая тема для FAQ. ![]() -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Заливаю в каталог
eBook/korob2001/ Через минут 20 будет там, сильно слабая скорость у FTP'шника.
Всегда пожалуйста. ;))))) Это сообщение отредактировал(а) korob2001 - 23.2.2005, 04:50 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Может тебе через ICQ кинуть??? Поотму как постоянно обрывается соединение.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Phoinix |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 16.11.2004 Где: Moskau Репутация: нет Всего: 2 |
korob2001
ммм... да... еще можно поподробнее смысл пременных $check и $class в процедуре new модуля... особенно с учетом того, что мы возвращаем только $self, причем в то самую переменную которую ты пытаешься "прикрутить" к $class ??? |
|||
|
||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Начну с конца, наверное так будет более понятнее.
Для bless можно передать как 1 так и 2 параметра, второй параметр не обязателен, он необходим только в том случае если нам нужно посвятить $self к определённому пакету, если не указан второй параметр, то используется текущий пакет. Теперь о переменной $self, в ней мы создаём анонимный хеш, т.е. структуру, он пуст, хотя это и не обязательно, как и сам анонимный хеш, вместо него может быть ссылка на любой тип данных будь то ссылка на массив, на скаляр, подпрограмму и т.д. Переменные для данного конструктора, в принципе, не обязательны. На основе того что я уже описал, уже можно сделать рабочий конструктор, который вернёт ссылку на объект. Вот пример:
Теперь перейдём к переменной $check, в неё сохраняем имя пакета, который передается в качестве параметра. Но так как в в качестве параметра может быть объект, а может и имя класса, нам нужно объкт преобразовать в имя класса, так как для bless второй париметр должен быть именем класса. вобщем строку:
можно описать так: Присвоить перенной $class имя каласса из объекта $check если $check является объектом, в противном случае присвоить просто имя класса если $check не является объектом. Можно было бы, конечно и не использовать переменную $class, $check, $self а просто сделать такой конструктор:
Это тот же конструктор, только в сокращённой форме, но пояснить его не знаю, удалось у меня или нет. Если не понял дай знать, буду пробовать ещё. Это сообщение отредактировал(а) korob2001 - 25.2.2005, 21:10 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |