The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Нюансы: 'компилятор' 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)

                >ну с твоим подходом это скорей извращение )))

                я это называю любопытством ;)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру