Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Возможно ли сделать переменные по умолчанию локаль


Автор: Logo 4.10.2009, 11:07
Возможно ли, чтобы переменные, для которых не указано my или our, были локальными, как в  python?

Автор: gcc 4.10.2009, 11:23
Logo, локально это где? в функции или в классе (между классами)?

может быть как-то можно сделать...

я вижу это: написать некоторый метод, и в конструкторе инкапсулировать, определять область видимости
есть фукниця caller, чтобы смотреть где вызывается(вызывалась) переменная http://perldoc.perl.org/functions/caller.html

может есть модуль на cpan.org для инкапсуляции переменных...

можно поинтересоватся, зачем это вам надо?

Автор: Logo 4.10.2009, 12:36
Т.е. с лексической областью видимости, my, а не our.
Цитата

можно поинтересоватся, зачем это вам надо?

my требуется гораздо чаще чем our. 

Автор: gcc 4.10.2009, 12:45
Logo, 

дело еще в том что my не обязательно писать, можно не писать вообще...

а в сложные ситуациях чтобы не запутаться с переменными и чтобы не сделать ошибки можно включить use Strict; потом выключить no Strict;

Автор: Logo 4.10.2009, 12:52
Цитата

дело еще в том что my не обязательно писать, можно не писать вообще...

В том-то и дело, что если my не писать, переменная будет our.

Автор: gcc 4.10.2009, 13:02
да, будет "глобальная", наверное, но можно сделать область видиомсти чтобы одна переменная в одном модуле не была видна в других... в одном массиве определить можно по-моему...

а в чем проблема что если она будет глобальная? можно переопределить $str = ' ';   и $str = undef;  
 

Автор: gcc 4.10.2009, 13:35
Logo, 

можно использовать хэш или какую-то струкртуру, обявить только один раз (хэш), проблем не будет с обявлением переменных...

Автор: sir_nuf_nuf 4.10.2009, 14:26
Logo, нет, средствами perl так сделать нельзя. 
В принципе можно использовать source фильры для этого.
Но если немного поразмыслить то так делать плохо и не нужно.

Какие плюсы у этого ?
1) чуть чуть меньше кода.
Какие минусы ?
1) Ваш код будет не похож ни на что другое. Если вы будите читать не только свой код, то придется постоянно переключаться
2) Ваш код потом придется долго разбирать, т.к. люди уже привыкли к стандарту.
3) Вы получаете зависимость от source фильтра, который не факт что везде есть.
4) Понетциальный проблемы с eval.. 

А вообще если вам приходится создавать много лексических переменных - это верный признак того, что вы неправильно пишете код.
По идее их должно быть 5 - 6 штук в функции, не более  - иначе следует разбить функцию на более мелкие.

Автор: Logo 4.10.2009, 16:57
Цитата

А вообще если вам приходится создавать много лексических переменных - это верный признак того, что вы неправильно пишете код.
По идее их должно быть 5 - 6 штук в функции, не более  - иначе следует разбить функцию на более мелкие. 


Наоборот, использование лексических переменных есть признак хорошего кода, т.к. не засоряется глобальное пространство имен.
Зачем обявлять глобальной переменную, которая используются в одном конкретном месте?

В source фильтре насколько я понял с проходит пред обработка кода как текста перед выполнением... тогда да, найти и корректно обработать все переменные целая история.

Автор: sir_nuf_nuf 4.10.2009, 23:08
Цитата(Logo @  4.10.2009,  16:57 Найти цитируемый пост)
Наоборот, использование лексических переменных есть признак хорошего кода, т.к. не засоряется глобальное пространство имен.
Зачем обявлять глобальной переменную, которая используются в одном конкретном месте?

вы меня не поняли.

Я согласен, что глобальные переменные нужно использовать очень ограниченно.

Но и лексические переменные разводить не нужно.

Если у вас появляется много лексических переменных - вероятно вы просто написали слишком длинную и грамоздкую функцию. Вам нужно разделить ее на более мелкие

P.S. я в последнее время вообще стараюсь придерживаться функционального стиля - интесивно использую map, grep циклы-суффиксы, тренарный опператор - ключевое слово my - встречается не более 2 - 3 раз в функции


Автор: Logo 6.10.2009, 16:31
Тем не менее есть переменные которые относятся к конкретному участку кода. К примеру из последней программы у меня my $response и my $request содержащие соответственно запрос и ответ LWP (и таких переменных больше, чем глобальных)
Типичный пример, итератор цикла, следовало бы писать так:
for(my $i=0; $i<100; $i) {}
Правда в случае с $i я все же ее как глобальную пишу, т.к. кроме циклов она ни где не используется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)