Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Допускается ли такое использование, sub { sub {} } 
:(
    Опции темы
AlexanderI
Дата 29.5.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Допускается ли такое использование ? Если у этого какие-то недостатки ?

Код

sub xxx {

...

sub yyy {  ... }

sub zzz {  ... }


}




Это сообщение отредактировал(а) AlexanderI - 29.5.2008, 11:44
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
ginnie
Дата 29.5.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Я бы не допустил  smile 
AlexanderI, не могли бы Вы пояснить смысл такого написания?

Это сообщение отредактировал(а) ginnie - 29.5.2008, 11:47


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AlexanderI
Дата 29.5.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Просто у меня есть большой файл где:
--------------------
Код

$ test = $test2

sub yyy1 {  ... }

sub yyy2 {  ... }

sub yyy3 {  ... }

sub yyy4 {  ... }

--------------------

Теперь появилась необходимость передовать в $test значения через shift.

т.е. вот так

Код

sub xxx {
$ test = shift;
sub yyy1 {  ... }
...
sub yyy4 {  ... }

}

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
shamber
Дата 29.5.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



AlexanderI, что то вы совсем путано пишите.
Вам что нужно одну переменную всем передавать?
Вообщем не понятно зачем так извращаться

Это сообщение отредактировал(а) shamber - 29.5.2008, 11:57
PM MAIL Jabber   Вверх
ginnie
Дата 29.5.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Понятнее не стало. Можно еще поподробнее? В функциях yyy1..4 надо видеть значение $test, присвоенное в xxx или что?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 29.5.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



может вместо этого
Код

sub xxx {
$ test = shift;
sub yyy1 {  ... }
...
sub yyy4 {  ... }

}

написать нечто такое
Код


$ test = shift; #присвоили
sub xxx {
return \$test; #ссылка даже лучше
}
sub yyy1 {
my $test = xxx();#получили
 }


хотя можно и лучше написать

Это сообщение отредактировал(а) shamber - 29.5.2008, 12:09
PM MAIL Jabber   Вверх
amg
Дата 29.5.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(AlexanderI @  29.5.2008,  11:44 Найти цитируемый пост)
Допускается ли такое использование ? Если у этого какие-то недостатки ?
Для перла не имеет значения, в каком месте кода определена функция. Все равно она будет доступна везде (по крайней мере, в пределах одного скрипта). Т.е. такое использование допускается. Недостатки - перлу все равно, програмисту - по обстоятельствам. Если бы мне потребовалось ипользовать функции, нужные только внутри подпрограммы (а иначе зачем их там определять?), то, чтобы не плодить лишние сущности, сделал бы так:
Код
syb xxx {
  my $yyy = sub {...};
  my $zzz = sub {...};
  ...
}


PM MAIL   Вверх
ginnie
Дата 29.5.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый amg, в связи с Вашим высказыванием

Цитата

Для перла не имеет значения, в каком месте кода определена функция. Все равно она будет доступна везде (по крайней мере, в пределах одного скрипта).


возник вопрос

Код

use strict;
use warnings;

my $test = 10;

sub func1 {
    my $test = 5;
    warn 'func1: ', $test;
    sub func2 {
        warn 'func2: ', $test;
    }
}

func1();
func2();


Код

func1: 5 at ../../test.pl line 8.
func2: 5 at ../../test.pl line 10.


Код

use strict;
use warnings;

my $test = 10;

sub func1 {
    my $test = 5;
    warn 'func1: ', $test;
}

sub func2 {
    warn 'func2: ', $test;
}

func1();
func2();


Код

func1: 5 at ../../test.pl line 8.
func2: 10 at ../../test.pl line 12.




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 29.5.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Уважаемый ginnie, мне кажется amg говорил о функции smile
и она действительно доступна из любого места программы.
о переменных не было ни слова
PM MAIL Jabber   Вверх
ginnie
Дата 29.5.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый shamber, меня смутила фраза "Для перла не имеет значения, в каком месте кода определена функция". Я ее трактовал по своему, поэтому и привел пример зависимости результатов от места определения функции. А с тем, что функция вызовется вне зависимости от места ее определения в package (в скрипте их может быть несколько smile ) я полностью согласен!

Это сообщение отредактировал(а) ginnie - 29.5.2008, 14:56


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
yura_nev
Дата 29.5.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Стоит обратить внимание, что в случае
Код
use strict;
use warnings;

my $test = 10;

sub func1 {
    my $test = time();
    warn 'func1: ', $test;
    sub func2 {
        warn 'func2: ', $test;
    }
}

func1();
func2();

sleep 2;
func1();
func2();
func2() - не просто функция - это замыкание:
Код
func1: 1212066460 at - line 8.
func2: 1212066460 at - line 10.
func1: 1212066462 at - line 8.
func2: 1212066460 at - line 10.

PM MAIL   Вверх
sir_nuf_nuf
Дата 29.5.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Ага, кстати очень интересное замыкание.
Оно создается тогда когда создается функция, т.е. на этапе компиляции, 
а вот переменные лексического окружения для такого замыкания инициализируется при первом вызове внешней функции:

Код

sub a {
  my $ss = shift;
  sub f {
    print $ss, "\n";
  }
}

f();
a(1);
f();
a(2);
f();


выведет
Код

          (пусто тут)
1
1



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
ginnie
Дата 29.5.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый yura_nev, похоже на замыкание, но есть нюанс  smile 

Код

use strict;
use warnings;

my $test = 10;

sub func1 {
    my $test = time();
    warn 'func1: ', $test;
    sub func2 {
        warn 'func2: ', $test // 'undef';
    }
}
func2();
func1();
sleep(1);
func1();
func2();


Код

func2: undef at ../../test.pl line 10.
func1: 1212069722 at ../../test.pl line 8.
func1: 1212069723 at ../../test.pl line 8.
func2: 1212069722 at ../../test.pl line 10.


подробности можно посмотреть в статье The Perl You Need To Know - Part 2


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ginnie
Дата 29.5.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый sir_nuf_nuf, там все немного сложнее  smile До этого момента я думал, что что-то понимаю в Perl  smile 

Код

use strict;
use warnings;

my $test = 10;
warn 'main: ', \$test;

my $func1 = sub {
    warn 'func1: ', \$test;
    sub func2 {
        warn 'func2: ', \$test;
    }
};

$func1->();
func2();
func2();
func2();
func2();
func2();
func2();


Код

main: SCALAR(0x804eb30) at ../../test.pl line 5.
func1: SCALAR(0x804eb30) at ../../test.pl line 8.
func2: SCALAR(0x809c0d4) at ../../test.pl line 10.
func2: SCALAR(0x809c0e0) at ../../test.pl line 10.
func2: SCALAR(0x809c0d4) at ../../test.pl line 10.
func2: SCALAR(0x809c0e0) at ../../test.pl line 10.
func2: SCALAR(0x809c0d4) at ../../test.pl line 10.
func2: SCALAR(0x809c0e0) at ../../test.pl line 10.


это у меня на компьютере что-то не так, или у Вас тоже воспроизведется?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 30.5.2008, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Код

main: SCALAR(0x182d8f0) at Perl-1.pl line 6.
func1: SCALAR(0x182d8f0) at Perl-1.pl line 9.
func2: SCALAR(0x1f3d1a0) at Perl-1.pl line 11.
func2: SCALAR(0x1f3d464) at Perl-1.pl line 11.
func2: SCALAR(0x1f3d1a0) at Perl-1.pl line 11.
func2: SCALAR(0x1f3d464) at Perl-1.pl line 11.
func2: SCALAR(0x1f3d1a0) at Perl-1.pl line 11.
func2: SCALAR(0x1f3d464) at Perl-1.pl line 11.

PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.