#! /usr/bin/perl -w
# Переменные объявленные как my (например my $var)-
# не включаются в таблицу имен (*var)
# и не имеют адреса по которому к ним можно обратиться (может если угадать.. ?)
# Если передать их адресс какой-либо переменной $tmp,
# то переменная $var автоматически поменяет свой адрес (типа компилятором.. ?)
# (p.s. нельзя локализовать local $var после объявления my $var)#ВОПРОС - если perl интерпретируемый язык - то откуда этот "компилятор"?
use strict;
our $tmp;sub b{
my $var1 = "hello";
my $var2;print "var1 =",\$var1," name_var1 = $var1\t";
print "var2 =",\$var2,"\t";$tmp = \$var1;
print "\\\$tmp = ",\$tmp,"name \$\$tmp = $$tmp\n";
$$tmp = "bie"; #пытаемся изменить значение переменной var1 на "bie", но это бесполезно, т.к. var1 имеет уже другой адрес, после того как переменной $tmp передали указатель на начальный адрес переменной var1
return;
}b;
b;
b;
--------------------
РЕЗУЛЬТАТ:var1 =SCALAR(0x9652b80) name_var1 = hello
var2 =SCALAR(0x9653380)
\$tmp = REF(0x9652b40)name $$tmp = hellovar1 =SCALAR(0x9634880) name_var1 = hello
var2 =SCALAR(0x9653380)
\$tmp = REF(0x9652b40)name $$tmp = hellovar1 =SCALAR(0x96349d0) name_var1 = hello
var2 =SCALAR(0x9653380)
\$tmp = REF(0x9652b40)name $$tmp = hello
Странные люди требуют непонятного :-)># Переменные объявленные как my (например my $var)-
># не включаются в таблицу имен (*var)
># и не имеют адреса по которому к ним можно обратиться (может если угадать.. ?)Какие ещё таблицы? Будьте проще: это просто локальные переменные, которые живут только пока выполняется блок, где они объявлены.
># Если передать их адресс какой-либо переменной $tmp,
># то переменная $var автоматически поменяет свой адрес (типа компилятором.. ?)Это не так. Переменная будет иметь один и тот же адрес, пока не завершится блок, где она объявлена. После этого переменная исчезает (на самом деле всё немного сложнее, но в первом приближении так). При следующем входе в этот блок создаётся новая переменная с тем же именем.
Да, и бросьте вы эту чехарду с адресами - всё-таки на языке высокого уровня пишете.
># (p.s. нельзя локализовать local $var после объявления my $var)
Ой, что-то вы не того хотите, чует моё сердце. Почитайте perlsub: local - это совсем не то, что кажется на первый взгляд.
>#ВОПРОС - если perl интерпретируемый язык - то откуда этот "компилятор"?
Ну вообще-то интерпретатор имеет право что-то там компилировать во внутренне представление для собственных нужд. В чём проблемы?
В вашем примере программы всё происходит именно так, как и написано, никаких странностей. Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта ждёте?
>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта
>ждёте?Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял, к чему всё это...
>>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта
>>ждёте?
>
>Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял,
>к чему всё это...Прошу прощения что не уточнил цель - я хочу понять "как устроено" в данном случае выделение памяти.
Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы перловского интерпритатора конкретно для функций my и local (а также немного не в тему - bless)). Мне было не понятно следующее:
1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только в случае если я пытался получить ее адрес.
* По поводу того что язык не нов и изжит... в общем для того и знакомлюсь с ним чтобы убедиться либо наоборот.* Кстати Python - я так понял просто более читаем, но что касается CPAN - то перл лидирует.
>Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы
>перловского интерпритатора конкретно для функций my и local (а также немного
>не в тему - bless)). Мне было не понятно следующее:я конечно еще тот "програмер", но по мойму называть my и local функциями это какбы ... некрасиво
это опесатели области видимости переменных>1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только
>в случае если я пытался получить ее адрес.ну какбы у перла много тонкостей при работе с переменными и вообще, переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между вызовами блока в котором она определена), так же у перла вроде есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>* По поводу того что язык не нов и изжит... в общем
>для того и знакомлюсь с ним чтобы убедиться либо наоборот.
>* Кстати Python - я так понял просто более читаем, но что
>касается CPAN - то перл лидирует.эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
а вы както через жопу ... )) вам ваще шашечки или ехать ))
>я конечно еще тот "програмер", но по мойму называть my и local
>функциями это какбы ... некрасиво
>это опесатели области видимости переменных
>Надеюсь проясню - меня больше интересует не сам перл, а то как устроены на уровне си - его функции. (На этом уровне - my и local ничто иное как функции).
>ну какбы у перла много тонкостей при работе с переменными и вообще,
>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>вызовами блока в котором она определена), так же у перла вроде
>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>Можно... например из того что в перл не существует вложенных функций?
>эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
>а вы както через жопу ... )) вам ваще шашечки или ехать
>))=)) - я ж сказал уже -- шашечки ). Говорю - что перл, только маленькое бесцельное увлечение.
>
>>я конечно еще тот "програмер", но по мойму называть my и local
>>функциями это какбы ... некрасиво
>>это опесатели области видимости переменных
>>
>
>Надеюсь проясню - меня больше интересует не сам перл, а то как
>устроены на уровне си - его функции. (На этом уровне -
>my и local ничто иное как функции).это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!!
он не является сильно-типизированным языком как Си - это интерпритатор
и my и local тут ограницения на уровне исполнения>>ну какбы у перла много тонкостей при работе с переменными и вообще,
>>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>>вызовами блока в котором она определена), так же у перла вроде
>>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>>
>
>Можно... например из того что в перл не существует вложенных функций?чево? ты про inline функции на Си?
>>эээ какбы сначала задачу формулируют а потом инструмент выбирают ...
>>а вы както через жопу ... )) вам ваще шашечки или ехать
>>))
>
>=)) - я ж сказал уже -- шашечки ). Говорю - что
>перл, только маленькое бесцельное увлечение.ну с твоим подходом это скорей извращение )))
>это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!!
>он не является сильно-типизированным языком как Си - это интерпритатор
>и my и local тут ограницения на уровне исполнениябудем считать - я понял.
>>>ну какбы у перла много тонкостей при работе с переменными и вообще,
>>>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между
>>>вызовами блока в котором она определена), так же у перла вроде
>>>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные
>>>
>>
>>Можно... например из того что в перл не существует вложенных функций?
>
>чево? ты про inline функции на Си?я про то что переменная определенная во внешней функции как my во внутренней функции определяется только один раз вне зависимости от того сколько раз была вызвана внешняя функция.
ну типа того:our $i = 0;
sub a($){
my $var = shift;
local $i = $var;
sub b{
print $var," - $i \n";
}
&b;
}a(1);
a(2);
a(3);#=========РЕЗУЛЬТАТ:
1 - 1
1 - 2
1 - 3
p.s. кстати именно из этого случая - я стал рыться с адресами переменных чтобы понять что к чему... а в итоге все оказалось просто: my - имеет лексическую область видимости, в то время как настоящих вложенных функций в perl нет, получается что &b - это внешняя функция, но во время "компиляции" в ней создается ячейка памяти с адресом (совпадающим с адресом переменной во внешней функции - а этот адрес заполняется только один раз, потому и получается что внутри вложенной функции остается одно и то же первоопределенное значение.)А вот на фоне этого - мне и стало интересно как на более низком уровне реализованы my local (и bless)
>ну с твоим подходом это скорей извращение )))
я это называю любопытством ;)
как интересно тебе ))
сначало сгенерировать заведомо глюкавый код а потом бегать и удивлятся ))