Хух..
почему на форуме никто перл не пропагандирует?? Чем дольше я в нем копаюсь, тем больше он мне нравится. Вот сначала написал программу (уже более 140%* выполнено), а потом взялся за изучение.
Итак. Начнем с азов. Какое нафиг ООП, когда, к моему изумлению, в перле аж 3 варианта декларирования переменных: my, our и local. И вроде уже относительно понял как они работают, но как только в начале всего кода добавляется магическое "use strict", то все идет к чертям
этот магический зверь проверяет объявлена переменная или нет.
Пока писал эти 10 строк, разобрался с переменными и стриктом. Оказывается вне функций (а точнее вне субрутин, их тут так называют) объявлять можно только с помощью my и our. В первом случае субрутина ни в коем случае не сможет сама дотянуться до переменной. Мало того, объявив через local, strict начнет ругаться, мол какого хрена ты не продекларировал переменную (об этом чуть ниже).
Пример
На выходе
Если использовать our, то и в субрутине нужно использовать our, чтобы получить переменную из вне, к тому же её значение можно будет изменить прямо из функции.
Пример
На выходе
если в функции main вы напишете "my $sh;", то результат будет как в первом примере.
Самое интересное осталось напоследок. Вообще командой local вообще нельзя объявлять переменную, ею можно только ограничивать запись. Записанные данные в переменную с помощью local будут действовать только после присвоения. А значит только в текущей функции и в подфункциях
Пример
на выходе
Для чего я это написал? В первую очередь для себя, пока писал и тестировал, разобрался что с чем едят. Можно было бы CookBook-и почитать, но нет.. так неинтересно.. да и на английском они.. впадлу вникать в перевод. Ну а во вторых - для таких же лентяев, как я.
П.С. пойду спать, а утром освежив память этой писаниной перепишу свою программу, быть может меньше памяти жрать будет. А так же попробую снизить нагрузку при помощи undef переменных.
* - 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
Пример
Код:
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
Самое интересное осталось напоследок. Вообще командой 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% выполнил больше, чем хотел.. ибо появлялись моменты, которые прерывали работу программы ("форсмажорные" эвенты на сайте)
П.П.С. хотел добавить префикс к теме. дик, поправь префикс на Инфо