Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы, работа с данными 
:(
    Опции темы
Bulat
Дата 1.10.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Вообщем-то раньше писал на яве, сейчас пишу на перле, но очень хочется порой писать по ООП'ному, просто так красивее и проще smile

Просмотрел ряд топиков, но все же...

Хочется решить такую задачу:

Есть класс, в нем инкапсулированные переменные класса, и методы getVariable1, getVariable2 и т.д., а также методы setVariable1, setVariable2 и т.д.
Все переменные должны поступать через конструктор класса, т.е. методы setVariable1  и т.д. только для правки. smile

Т.е. по сути дела класс - лишь контейнер для хранения данных. 

Далее каждый экземпляр класса должен хранится в массиве, и при необходимости получать ту или иную переменную через метод getVariableX, соотв. для этого он и задумывается smile

Вообще видел один не плохой топик, однако то, что меня в нем не устроило, то, что там массив был внутри самого экземпляра класса. Мне же нужно чтоб класс был лишь "контейнером". Т.е. каждый экземпляр класса хранить по одному набору переменных объявленных в классе. А все экземпляры класса хранятся в массиве, скажем так основного скрипта. При прохождении данного массива обращаемся каждый раз к очередному экземпляру класса и работаем с переменными из данного экземпляра...

Надеюсь понятно выразился... smile




--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
korob2001
Дата 1.10.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Ну насколько я понял, нужно что-то типа этого:

Есть класс Person, поля которого хранят имя, фамилию и возраст человека. Опишем его:

Файл Person.pm
Код

package Person;

# Конструктор класса Person
sub new {
    my $check = shift;
    my $class = ref($check) || $check;
    my $self  = {
        # Поля класса
        NAME => "",   # Имя - Значение по умолчанию, пустая строка
        FAMILY => "", # Фамилия - Значение по умолчанию, пустая строка
        AGE => 0,     # Возраст - Значение по умолчанию, 0
        @_,           # Присвоим полученный список
    };

    # Посвящаем ссылку в объект и возвращаем его
    return bless($self, $class);
}

################################################################################
# Методы доступа                                                               #
################################################################################

# Метод возвращает имя человека
sub getName {
    return shift->{NAME};
}

# Метод возвращает фамилию человека
sub getFamily {
    return shift->{FAMILY};
}

# Метод возвращает возраст человека
sub getAge {
    return shift->{AGE};
}

# Метод меняет имя человека
sub setName {
    my $self = shift;
    $self->{NAME} = shift if scalar @_;
}

# Метод меняет фамилию человека
sub setFamily {
    my $self = shift;
    $self->{FAMILY} = shift if scalar @_;
}

# Метод меняет возраст человека
sub setAge {
    my $self = shift;
    $self->{AGE} = shift if scalar(@_) && $_[0] > 0;
}

################################################################################
# Имитируем перегруженный метод. Если метод получает число, оно прибавляется   #
# к возрасту, если же метод был вызван без параметров, то добавляем к возрасту #
# единицу.                                                                     #
################################################################################
sub addAge {
    my $self = shift;
    my $add  = (scalar(@_) && ($_[0] =~ /^\d+$/) && ($_[0] > 0)) ? shift : 1;
    $self->{AGE} += $add;
}

1;

Теперь сохраним в тот же каталог, файл который будет использовать наш класс Person.

Файл people.pl
Код

#!/usr/bin/perl -w
use strict;
use Person;

# Создаём массив объектов Person
my @people = (
    new Person(NAME => "Вася", FAMILY => "Пупкин", AGE => 16),
    new Person(NAME => "Коля", FAMILY => "Герасимов", AGE => 12),
    new Person(NAME => "Валя", FAMILY => "Брусникина", AGE => 20)
);

# Пройдём по всему массиву и покажем информацию о каждом человеке
foreach my $person (@people) {
        print "Имя: " . $person->getName() . "\n";
        print "Фамилия: " . $person->getFamily() . "\n";
        print "Возраст: " . $person->getAge() . "\n\n";
}

# Следующая строка, просто разделитель
print "=" x 80, "\n";

################################################################################
# Теперь можно добавим каждому по одному году используюя метод addAge() без    #
# параметров. И снова покажем весь список.                                     #
################################################################################
for (my $i=0; $i < scalar(@people); $i++) {
     # Я намеренно использовал цикл for с переменной - счётчиком,
     # так, для разнообразия.
     $people[$i]->addAge();
}

################################################################################
# Покажем заново всех людей из нашего массива, так как нам массив дальше не    #
# понадобится, то обнуляем массив и попутно выводим информацию окаждом клиете  #
################################################################################
while (my $person = shift @people) {
       print "Имя: " . $person->getName() . "\n";
       print "Фамилия: " . $person->getFamily() . "\n";
       print "Возраст: " . $person->getAge() . "\n\n";
}

Я для краткости, не стал использовать все методы, но ты если хочешь можешь опробовать и их, но тогда последний цикл тебе придётся заменить, так как в нём массив очищается, так как используется как стёк, т.е. вместо строки:
Код

while (my $person = shift @people) {

Вставь наример такую:
Код

foreach my $person (@people) {

После этого цикла все объекты так и будут храниться в нашем массиве @people и будет возможность поэксперементировать с ним ещё. Например можно попробовать добавить каждому человеку не по одному году, а по 5 лет используя всё тот же метод addAge() но уже с одним параметром типа int.
Код

$person->addAge(5);

Здесь параметры получаемые конструктором получились именованные, если же хочешь сделать так, как в Java, то в конструкторе используй анонимный массив вместо анонимного хеша.

Но это так, простейший пример, если хочешь более подробно, то поищи в разделах по Perl, по ключевому слову "ООП" или "Объектно Ориентированное Программирование", а так же советую почитать книгу "Программирование на Perl", в ней автор языка более подробно описывает данную тему. Если знаком с Java, то думаю всё будет понятно.

Это сообщение отредактировал(а) korob2001 - 1.10.2007, 21:06


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Bulat
Дата 2.10.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



korob2001, супер.... Это даже больше чем я ожидал...

Есть только пара вопросов, чтоб добить это

Код

# Конструктор класса Person
sub new {
    my $check = shift;
    my $class = ref($check) || $check;
    my $self  = {
        # Поля класса
        NAME => "",   # Имя - Значение по умолчанию, пустая строка
        FAMILY => "", # Фамилия - Значение по умолчанию, пустая строка
        AGE => 0,     # Возраст - Значение по умолчанию, 0
        @_,           # Присвоим полученный список
    };

    # Посвящаем ссылку в объект и возвращаем его
    return bless($self, $class);
}


Я так понял, объявление переменных внутри класса, инкапсулирует их ???

И как бы так грамотнее выразится... $self и будет являтся экземпляром класса ???

И послдений пока вопрос:

Код

    new Person(NAME => "Вася", FAMILY => "Пупкин", AGE => 16),


немного напоминает объявление массива хэшэй, но суть вопроса не в этом.... Как правило в яве, вроде бы и в С++, в конструкторе мы пишем все входные параметры, а при создании очередного экземпляра класса, лишь пишем, допустим

$name = "Вася"
$family = "Пупкин"
$age = 16

new Person($name, $family, $age)


и тут главное соблюдат правильную последовательность переменных... При таком объявлении, возможно не соблюдение последовательности ???

Добавлено через 13 минут и 32 секунды
Млин, прям все это так глаз радует, все эти старые геттеры и сеттеры, методы и классы, и все на перле..... Море восторга, и соотв...


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 2.10.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



М-дя, и в догонку очень важный вопрос о деструкторах... В яве-то их ручками писать не надо, а как насчет перла ??


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
nitr
Дата 2.10.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Bulat, тоже самое "не надо", но это исходя из задачи. В данном примере - не нужен.

А korob2001 как всегда smile обучает народ. Молодец! ;)


--------------------
PM   Вверх
Bulat
Дата 2.10.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



nitr

А хорошего ;) , ресурса про ООП в перле случаем нет... А то в рамках данного примера все гуд, вот только хотелось более полно догнать такие вещи как наследование, инкапсуляция и т.п. 

P.S. Ссылки на топики форума прошу не кидать, в целом почти все промсотрел, но хотелось бы более полного материала smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
cerf_machine
Дата 2.10.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.2.2007
Где: тебя носило?

Репутация: 1
Всего: 1



Инкапсуляции в перле нет. Т.е. в представленном выше примере можно обращаться к "свойствам" "объекта" напрямую:

Код

my $person = new Person;

$person->{NAME} = "o___O";


Наследование в перле не использовал, но знаю, что оно тоже, к сожалению, псевдо, как и перегрузка операторов:( Реализуется через подключение базового класса в @ISA дочернего.

Цитата

И как бы так грамотнее выразится... $self и будет являтся экземпляром класса ???

Ага. Но на самом деле $self - ссылка на хэш, связанная (blessed) с текущим пакетом (Person). Свойства же - на самом деле - ключи хэша.
Цитата

При таком объявлении, возможно не соблюдение последовательности ???

Да, возможно.

Это сообщение отредактировал(а) cerf_machine - 2.10.2007, 14:41
PM MAIL ICQ   Вверх
korob2001
Дата 2.10.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата(Bulat @  2.10.2007,  06:00 Найти цитируемый пост)
Я так понял, объявление переменных внутри класса, инкапсулирует их ???


Как сказал cerf_machine, инкапсуляция отсутсвует, как таковая, это философия Perl. Но, Perl позволяет сделать закрытость ещё более надёжную, чем другие языки программирования, разумеется, если это нужно.   smile 

Например можно таким образом изменить класс Person, который я приводил выше.
Код

package Person;

# Конструктор класса Person
sub new {
    my $check = shift;
    my $class = ref($check) || $check;

    # Поля класса
    my $fields = {
        NAME => "",
        FAMILY => "",
        AGE => 0, @_
    };

    my $self = sub {
        my $field = shift;
        my $f = (caller)[1];

        # Если запрос сделан не из текущего файла, умираем с музыкой
        die "This class using only private fields. For get or set value to " .
            "private fields, use access methods get/setName(), " .
            "get/setFamily(), get/setAge()." unless $f eq __FILE__;

        $fields->{$field} = shift if (@_);
        return $fields->{$field};
    };

    # Посвящаем ссылку в объект и возвращаем его
    bless($self, $class);
    return $self;
}

################################################################################
# Методы доступа                                                               #
################################################################################

# Метод возвращает имя человека
sub getName {
    shift->("NAME");
}

# Метод возвращает фамилию человека
sub getFamily {
    return shift->("FAMILY");
}

# Метод возвращает возраст человека
sub getAge {
    return shift->("AGE");
}

# Метод меняет имя человека
sub setName {
    my $self = shift;
    $self->("NAME", @_) if scalar @_;
}

# Метод меняет фамилию человека
sub setFamily {
    my $self = shift;
    $self->("FAMILY", @_) if scalar @_;
}

# Метод меняет возраст человека
sub setAge {
    my $self = shift;
    $self->("AGE", @_) if scalar(@_) && $_[0] > 0;
}

################################################################################
# Имитируем перегруженный метод. Если метод получает число, оно прибавляется   #
# к возрасту, если же метод был вызван без параметров, то добавляем к возрасту #
# единицу.                                                                     #
################################################################################
sub addAge {
    my $self = shift;
    my $add  = (scalar(@_) && ($_[0] =~ /^\d+$/) && ($_[0] > 0)) ? shift : 1;
    $self->("AGE", $self->("AGE") + $add);
}

1;

Вот собственно мы и закрылись, теперь поля доступны только внутри файла Person.pm, т.е. мы получили private поля. Можно так же сделать и protected, ну или что-то похожее на protected поля в Java, если изменить условие в конструкторе:
Код

        my $f = (caller)[1];

        # Если запрос сделан не из текущего файла, умираем с музыкой
        die "This class using only private fields. For get or set value to " .
            "private fields, use access methods get/setName(), " .
            "get/setFamily(), get/setAge()." unless $f eq __FILE__;

на такое:
Код

        my($p,$f) = caller;

        # Если запрос сделан не из текущего пакета или не из наследника, умираем с музыкой
        die "This class using only protected fields. For get or set value to " .
            "private fields, use access methods get/setName(), " .
            "get/setFamily(), get/setAge()." if (($p ne __PACKAGE__) || !$p->isa(__PACKAGE__))

Т.е. напрямую к полям теперь можно будет обращаться только из текущего пакета или же из классов наследников. Можно так же реализовать и закрытые методы, опять же, если это нужно.

Цитата(Bulat @  2.10.2007,  06:00 Найти цитируемый пост)
и тут главное соблюдат правильную последовательность переменных... При таком объявлении, возможно не соблюдение последовательности ???

Абсолютно верно, потому использовать анонимный хеш гораздо удобнее, не следует думать о перегрузке конструктора. Если же хочешь создать аналог создания Java или C++ объекта, то вместо анонимного хеша используй анонимный массив:

Вот так теперь будет выглядеть наш класс Person.pm
Код

package Person;

# Конструктор класса Person
sub new {
    my $check = shift;
    my $class = ref($check) || $check;

    my $self = [ @_ ];

    return bless($self,$class);
}

################################################################################
# Методы доступа                                                               #
################################################################################

# Метод возвращает имя человека
sub getName {
    shift->[0];
}

# Метод возвращает фамилию человека
sub getFamily {
    return shift->[1];
}

# Метод возвращает возраст человека
sub getAge {
    return shift->[2];
}

# Метод меняет имя человека
sub setName {
    my $self = shift;
    $self->[0] = shift if scalar @_;
}

# Метод меняет фамилию человека
sub setFamily {
    my $self = shift;
    $self->[1] = shift if scalar @_;
}

# Метод меняет возраст человека
sub setAge {
    my $self = shift;
    $self->[2] = shift if scalar(@_) && $_[0] > 0;
}

################################################################################
# Имитируем перегруженный метод. Если метод получает число, оно прибавляется   #
# к возрасту, если же метод был вызван без параметров, то добавляем к возрасту #
# единицу.                                                                     #
################################################################################
sub addAge {
    my $self = shift;
    my $add  = (scalar(@_) && ($_[0] =~ /^\d+$/) && ($_[0] > 0)) ? shift : 1;
    $self->[2] += $add;
}

1;
 
а вот программа, которая его использует:
Код

#!/usr/bin/perl -w
use strict;
use Person;

# Создаём массив объектов Person
my @people = (
    new Person("Вася", "Пупкин", 16),
    new Person("Коля", "Герасимов", 12),
    new Person("Валя", "Брусникина", 20)
);

# Пройдём по всему массиву и покажем информацию о каждом человеке
foreach my $person (@people) {
        print "Имя: " . $person->getName() . "\n";
        print "Фамилия: " . $person->getFamily() . "\n";
        print "Возраст: " . $person->getAge() . "\n\n";
}

# Следующая строка, просто разделитель
print "=" x 80, "\n";

################################################################################
# Теперь можно добавим каждому по одному году используюя метод addAge() без    #
# параметров. И снова покажем весь список.                                     #
################################################################################
for (my $i=0; $i < scalar(@people); $i++) {
     # Я намеренно использовал цикл for с переменной - счётчиком,
     # так, для разнообразия.
     $people[$i]->addAge();
}

################################################################################
# Покажем заново всех людей из нашего массива, так как нам массив дальше не    #
# понадобится, то обнуляем массив и попутно выводим информацию окаждом клиете  #
################################################################################
while (my $person = shift @people) {
       print "Имя: " . $person->getName() . "\n";
       print "Фамилия: " . $person->getFamily() . "\n";
       print "Возраст: " . $person->getAge() . "\n\n";
}

Кстати, можно так же заюзать псевдо-хеш, хотя они сейчас помечены как depricated, но в Perl можно реализовать что-то похожее на псевдо-хеш вручную, а можно так же и не вручную, например заюзав прагму компилятора fields  smile 

Цитата(Bulat @  2.10.2007,  06:17 Найти цитируемый пост)
М-дя, и в догонку очень важный вопрос о деструкторах... В яве-то их ручками писать не надо, а как насчет перла ?? 

В Perl сборка мусора происходит тоже автоматически, примерно так же, как и в Java, потому деструкторы нужно юзать, как сказал nitr, только в исключительных случаях.

Это сообщение отредактировал(а) korob2001 - 2.10.2007, 20:09


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 2.10.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Кстати, ты говорил, что знаком с Java. Вот я тут как-то приводил пример того, как можно создавать классы Java на лету, прямо из Perl программы, а после этого создавать объекты в Perl программе и работать с ними, как с родными Perl объектами. Это работает примерно так же, как встроенный код Assembler'a в программу C++.

Вот здесь можешь посмотреть этот пример.

Кстати, таким же макаром, можно встраивать в Perl программу и код на C++, Assembler, Basic, да и многих других языков и не только языков. Вобщем если будет интересно, то поищи модули на cpan.org, по ключевому слову "Inline". Если ты под виндой, то можешь просто набрать в командной строке, такую команду:

C:\>ppm s Inline

Получишь список модулей, для встраивания кода других языков в Perl программу. Что бы установить модуль дай команду:

C:\>ppm i Inline-Java

Или другое имя модуля, вместо Inline-Java.





--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Bulat
Дата 3.10.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



korob2001, ну инкапсуляция перемнных в классе-контейнере, вообще очень важна, так как если в ходе работы программы у нас создается не один экземпляр класса, то потом при попытке получить доступ, может вообще такая путаница произойти.... Вообщем как-то было у меня один раз в яве, после чего даже не стал разбиратся, тут это для меня как бы аксиома

В целом огромное пасиба, за очень содержательные ответы... А ссылки на досуге обязательно почитаю, хотя в моей текущей конторе мы пишем исключительно на перле.. Да и раньше кода я комбинировал яву с перлом, то это были отдельные программы одной системы, как правило перл использовал за их регулярки... Если же внутри кода создавать, то я так понимаю, нужно будет устанавливать и виртуальную ява-машину, сейчас, я думаю мне этого никто не позволит сделать, в новой конторе я еще не набрал такого "веса"  smile 

cerf_machine, тоже большой сенкс smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
cerf_machine
Дата 4.10.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.2.2007
Где: тебя носило?

Репутация: 1
Всего: 1



Цитата

Но, Perl позволяет сделать закрытость ещё более надёжную, чем другие языки программирования, разумеется, если это нужно.

Ух, тыsmile

Даже не думал, что можно связать с пакетом ссылку на функцию. Хотя это логично - перл крайне гибкий язык.

korob2001, спасибо.
Bulat, не за что;)
PM MAIL ICQ   Вверх
Bulat
Дата 5.10.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



К сожалению пока углубится особенно в ООП на перле нет времени...

Появился такой вопрос...

При стандартном сеттере, если передаешь в качестве параметра не саму переменную, допустим $name = "Александр", а

setName((shortName($name)));

т.е., процедура shortName делает какие-то модификации с самой переменной...

??


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
cerf_machine
Дата 5.10.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.2.2007
Где: тебя носило?

Репутация: 1
Всего: 1



Не понял вопрос.

Код

setName( shortName( $name ) );


setName получит $_[0] => return-значение shortName.
PM MAIL ICQ   Вверх
Bulat
Дата 5.10.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



cerf_machine

вопрос ты как раз понял и ответил на него smile

Я лишь хотел убедится, что реально метод получит значение возвращаемое процедурой smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
korob2001
Дата 5.10.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Ответ уже дали, но всё же решил привести ещё один пример, так на всякий случай  smile :
Код

#!/usr/bin/perl -w
use strict;
use Person;   # Наш класс

# Если программа не получила параметр, покажем информацию, как правильно
# запустить её с терминала.
die "\nPlease start this programm with one parameter - your name.\n" .
    "Forexample so:\nC:\\>perl $0 aNtOn\n" unless @ARGV;

# Создаём объект класса Person
my $person = new Person();

# Установим имя из полученное из командной строки коммандной строки
$person->setName( ucfirst( lc( shift )));

# Выводим имя на STDOUT
print "\nYour name is: @{[$person->getName()]}\n";

Теперь осталось запустить программу из командной строки и передать ей своёимя в качестве параметра. Причём, что бы налядно увидеть работу программы, имя должно быть в беспорядочном регистре, например так: dEnNiS. Если программа была запушена правильно, то регистр будет исправлен.

Нас интересует строка:
Код

$person->setName( ucfirst( lc( shift )));

Сначала передаём параметр функции lc(), она преобразует строку в нежний регистр, т.е. она возвращает строку "dennis"  и тут же передаёт её дальше, функции ucfirst(), которая поднимает первый символ строки в верхний регистр и возращает результат "Dennis" и наконец предаёт отредактированное имя методу $person->setName().
Т.е. сначала выполняется самая внутренняя функция, это аналогично применению скобок для изменения приоритета арифметических операций.

Тоже самое можно делать и с методами, добавим в код ещё две строки, теперь он выглядит так:
Код

#!/usr/bin/perl -w
use strict;
use Person;   # Наш класс

# Если программа не получила параметр, покажем информацию, как правильно
# запустить её с терминала.
die "\nPlease start this programm with one parameter - your name.\n" .
    "Forexample so:\nC:\\>perl $0 aNtOn\n" unless @ARGV;

# Создаём объект класса Person
my $person = new Person();

# Установим имя из полученное из командной строки коммандной строки
$person->setName( ucfirst( lc( shift )));

# Выводим имя на STDOUT
print "\nYour name is: @{[$person->getName()]}\n";

# Преобразуем уже установленное имя в верхний регистр
$person->setName( uc( $person->getName() ) );

# Выводим имя на STDOUT
print "\nYour name is: @{[$person->getName()]}\n";

В строке:
Код

$person->setName( uc( $person->getName() ) );

сначала выполняется метод $person->getName(), он возвращает текущее имя "Dennis", это имя передаётся функции uc(), которая переводит верхний регистр всю строку "DENNIS" и в конце устанавливаем уже проеобразованное имя методом $person->setName(). 

Это сообщение отредактировал(а) korob2001 - 5.10.2007, 17:06


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.