Perl и его манеры

AndrjuXA

Новичок
Репутация
0 / 380
Хух.. :) почему на форуме никто перл не пропагандирует?? Чем дольше я в нем копаюсь, тем больше он мне нравится. Вот сначала написал программу (уже более 140%* выполнено), а потом взялся за изучение.

Итак. Начнем с азов. Какое нафиг ООП, когда, к моему изумлению, в перле аж 3 варианта декларирования переменных: my, our и local. И вроде уже относительно понял как они работают, но как только в начале всего кода добавляется магическое "use strict", то все идет к чертям :) этот магический зверь проверяет объявлена переменная или нет.

Пока писал эти 10 строк, разобрался с переменными и стриктом. Оказывается вне функций (а точнее вне субрутин, их тут так называют) объявлять можно только с помощью my и our. В первом случае субрутина ни в коем случае не сможет сама дотянуться до переменной. Мало того, объявив через local, strict начнет ругаться, мол какого хрена ты не продекларировал переменную (об этом чуть ниже).
Пример
Код:
use strict;
my $sh = "started"; # объявляем доступ только для глобальной области
main();
print "global sh: $sh\n";

sub main
    {
    our $sh; # пробуем получить из глобальной области
    print "main sh: $sh\n";
    $sh = "ended";  # пробуем изменить значение в глобальной области
    }
На выходе
Код:
main sh:
global sh: started
Если использовать our, то и в субрутине нужно использовать our, чтобы получить переменную из вне, к тому же её значение можно будет изменить прямо из функции.
Пример
Код:
use strict;
our $sh = "started"; # объявляем доступ для всех областей
main();
print "global sh: $sh\n";

sub main
    {
    our $sh; # получаем из глобальной области
    print "main sh: $sh\n";
    $sh = "ended"; # меняем значение в глобальной области
    }
На выходе
Код:
main sh: started
global sh: ended
если в функции main вы напишете "my $sh;", то результат будет как в первом примере.

Самое интересное осталось напоследок. Вообще командой local вообще нельзя объявлять переменную, ею можно только ограничивать запись. Записанные данные в переменную с помощью local будут действовать только после присвоения. А значит только в текущей функции и в подфункциях
Пример
Код:
use strict;

our $sh = "started"; # объявляем доступ для всех областей
main1();
main2();
print "global sh: $sh\n";

sub main1
    {
    our $sh; # получаем из глобальной области
    print "main1 sh: $sh\n";
    $sh = "dapf.ru"; # меняем значение в глобальной области
    }
    
sub main2
    {
    our $sh; # получаем из глобальной области
    print "main2 sh: $sh\n";
    local $sh = "deleted"; # меняем локальное значение
    main3();
    print "main2_2 sh: $sh\n";
    }
    
sub main3
    {
    our $sh; # получаем из main2 области
    print "main3 sh: $sh\n";
    $sh = "greh.ru"; # меняем значение в main2 области
    }
на выходе
Код:
main1 sh: started
main2 sh: dapf.ru
main3 sh: deleted
main2_2 sh: greh.ru
global sh: dapf.ru

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

П.С. пойду спать, а утром освежив память этой писаниной перепишу свою программу, быть может меньше памяти жрать будет. А так же попробую снизить нагрузку при помощи undef переменных.

* - 140% выполнил больше, чем хотел.. ибо появлялись моменты, которые прерывали работу программы ("форсмажорные" эвенты на сайте)

П.П.С. хотел добавить префикс к теме. дик, поправь префикс на Инфо
 
Начал бы с самого начала, а именно как его устанавить, настроить, связать с Apache под виндой или линуксом.
Думаю это в начале будет полездна)
 
С этим я не заморачивался. Мне не для этих нужд. Но вообще я взял версию 5.10 от strawberry (strawberryperl.com) и просто заинсталил на винде. периодически качаю библиотеки с помощью PPM или CPAN, которые идут в комплекте.
П.П.С. хотел добавить префикс к теме. дик, поправь префикс на Инфо
 
Сверху