Нюансы: 'компилятор' perl, zs, 13-Янв-10, 22:12 [смотреть все]#! /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 = hello var1 =SCALAR(0x9634880) name_var1 = hello var2 =SCALAR(0x9653380) \$tmp = REF(0x9652b40)name $$tmp = hello var1 =SCALAR(0x96349d0) name_var1 = hello var2 =SCALAR(0x9653380) \$tmp = REF(0x9652b40)name $$tmp = hello
|
- Нюансы: 'компилятор' perl, XAnder, 08:54 , 14-Янв-10 (2)
Странные люди требуют непонятного :-)># Переменные объявленные как my (например my $var)- ># не включаются в таблицу имен (*var) ># и не имеют адреса по которому к ним можно обратиться (может если угадать.. ?) Какие ещё таблицы? Будьте проще: это просто локальные переменные, которые живут только пока выполняется блок, где они объявлены. ># Если передать их адресс какой-либо переменной $tmp, ># то переменная $var автоматически поменяет свой адрес (типа компилятором.. ?) Это не так. Переменная будет иметь один и тот же адрес, пока не завершится блок, где она объявлена. После этого переменная исчезает (на самом деле всё немного сложнее, но в первом приближении так). При следующем входе в этот блок создаётся новая переменная с тем же именем. Да, и бросьте вы эту чехарду с адресами - всё-таки на языке высокого уровня пишете. ># (p.s. нельзя локализовать local $var после объявления my $var) Ой, что-то вы не того хотите, чует моё сердце. Почитайте perlsub: local - это совсем не то, что кажется на первый взгляд. >#ВОПРОС - если perl интерпретируемый язык - то откуда этот "компилятор"? Ну вообще-то интерпретатор имеет право что-то там компилировать во внутренне представление для собственных нужд. В чём проблемы? В вашем примере программы всё происходит именно так, как и написано, никаких странностей. Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта ждёте?
- Нюансы: 'компилятор' perl, jd, 18:24 , 14-Янв-10 (3)
>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта >ждёте? Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял, к чему всё это...
- Нюансы: 'компилятор' perl, zs, 12:12 , 15-Янв-10 (5)
>>Только непонятно, зачем всё это. Чего вы добиваетесь? Какого эффекта >>ждёте? > >Видимо, сокрушить нам мозг. Тоже раза три перечитал, так и не понял, >к чему всё это... Прошу прощения что не уточнил цель - я хочу понять "как устроено" в данном случае выделение памяти. Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы перловского интерпритатора конкретно для функций my и local (а также немного не в тему - bless)). Мне было не понятно следующее: 1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только в случае если я пытался получить ее адрес. * По поводу того что язык не нов и изжит... в общем для того и знакомлюсь с ним чтобы убедиться либо наоборот.
* Кстати Python - я так понял просто более читаем, но что касается CPAN - то перл лидирует.
- Нюансы: 'компилятор' perl, Pahanivo, 13:38 , 15-Янв-10 (6)
>Кстати, может кто подскажет где можно посмотреть реализацию perl'овских функций (т.е. сырцы >перловского интерпритатора конкретно для функций my и local (а также немного >не в тему - bless)). Мне было не понятно следующее: я конечно еще тот "програмер", но по мойму называть my и local функциями это какбы ... некрасиво это опесатели области видимости переменных >1. обратите внимание, что переменные (my) меняют адреса при разных вызовах только >в случае если я пытался получить ее адрес. ну какбы у перла много тонкостей при работе с переменными и вообще, переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между вызовами блока в котором она определена), так же у перла вроде есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные >* По поводу того что язык не нов и изжит... в общем >для того и знакомлюсь с ним чтобы убедиться либо наоборот. >* Кстати Python - я так понял просто более читаем, но что >касается CPAN - то перл лидирует. эээ какбы сначала задачу формулируют а потом инструмент выбирают ... а вы както через жопу ... )) вам ваще шашечки или ехать ))
- Нюансы: 'компилятор' perl, zs, 13:46 , 15-Янв-10 (8)
>я конечно еще тот "програмер", но по мойму называть my и local >функциями это какбы ... некрасиво >это опесатели области видимости переменных >Надеюсь проясню - меня больше интересует не сам перл, а то как устроены на уровне си - его функции. (На этом уровне - my и local ничто иное как функции). >ну какбы у перла много тонкостей при работе с переменными и вообще, >переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между >вызовами блока в котором она определена), так же у перла вроде >есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные > Можно... например из того что в перл не существует вложенных функций? >эээ какбы сначала задачу формулируют а потом инструмент выбирают ... >а вы както через жопу ... )) вам ваще шашечки или ехать >)) =)) - я ж сказал уже -- шашечки ). Говорю - что перл, только маленькое бесцельное увлечение.
- Нюансы: 'компилятор' perl, Pahanivo, 14:35 , 15-Янв-10 (9)
> >>я конечно еще тот "програмер", но по мойму называть my и local >>функциями это какбы ... некрасиво >>это опесатели области видимости переменных >> > >Надеюсь проясню - меня больше интересует не сам перл, а то как >устроены на уровне си - его функции. (На этом уровне - >my и local ничто иное как функции). это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!! он не является сильно-типизированным языком как Си - это интерпритатор и my и local тут ограницения на уровне исполнения >>ну какбы у перла много тонкостей при работе с переменными и вообще, >>переменную типа "my" можно скажем сделать статичной (чтобы сохранялосья значение между >>вызовами блока в котором она определена), так же у перла вроде >>есть щняга типа "сборшик мусора" которая вычищает неиспользуемые переменные >> > >Можно... например из того что в перл не существует вложенных функций? чево? ты про inline функции на Си? >>эээ какбы сначала задачу формулируют а потом инструмент выбирают ... >>а вы както через жопу ... )) вам ваще шашечки или ехать >>)) > >=)) - я ж сказал уже -- шашечки ). Говорю - что >перл, только маленькое бесцельное увлечение. ну с твоим подходом это скорей извращение )))
- Нюансы: 'компилятор' perl, zs, 16:33 , 15-Янв-10 (10)
>это НЕ функции!!!! это не Си!!!! это язык уровнем выше!!! интерпритаторный!!!! >он не является сильно-типизированным языком как Си - это интерпритатор >и 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) >ну с твоим подходом это скорей извращение ))) я это называю любопытством ;)
- Нюансы: 'компилятор' perl, Pahanivo, 17:44 , 15-Янв-10 (11)
как интересно тебе )) сначало сгенерировать заведомо глюкавый код а потом бегать и удивлятся ))
|