![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Возможно ли, чтобы переменные, для которых не указано my или our, были локальными, как в python?
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
Logo, локально это где? в функции или в классе (между классами)?
может быть как-то можно сделать... я вижу это: написать некоторый метод, и в конструкторе инкапсулировать, определять область видимости есть фукниця caller, чтобы смотреть где вызывается(вызывалась) переменная http://perldoc.perl.org/functions/caller.html может есть модуль на cpan.org для инкапсуляции переменных... можно поинтересоватся, зачем это вам надо? Это сообщение отредактировал(а) gcc - 4.10.2009, 11:25 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Т.е. с лексической областью видимости, my, а не our.
my требуется гораздо чаще чем our. |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
Logo,
дело еще в том что my не обязательно писать, можно не писать вообще... а в сложные ситуациях чтобы не запутаться с переменными и чтобы не сделать ошибки можно включить use Strict; потом выключить no Strict; Это сообщение отредактировал(а) gcc - 4.10.2009, 12:46 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
В том-то и дело, что если my не писать, переменная будет our. |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
да, будет "глобальная", наверное, но можно сделать область видиомсти чтобы одна переменная в одном модуле не была видна в других... в одном массиве определить можно по-моему...
а в чем проблема что если она будет глобальная? можно переопределить $str = ' '; и $str = undef; Это сообщение отредактировал(а) gcc - 4.10.2009, 13:02 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
Logo,
можно использовать хэш или какую-то струкртуру, обявить только один раз (хэш), проблем не будет с обявлением переменных... |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Logo, нет, средствами perl так сделать нельзя.
В принципе можно использовать source фильры для этого. Но если немного поразмыслить то так делать плохо и не нужно. Какие плюсы у этого ? 1) чуть чуть меньше кода. Какие минусы ? 1) Ваш код будет не похож ни на что другое. Если вы будите читать не только свой код, то придется постоянно переключаться 2) Ваш код потом придется долго разбирать, т.к. люди уже привыкли к стандарту. 3) Вы получаете зависимость от source фильтра, который не факт что везде есть. 4) Понетциальный проблемы с eval.. А вообще если вам приходится создавать много лексических переменных - это верный признак того, что вы неправильно пишете код. По идее их должно быть 5 - 6 штук в функции, не более - иначе следует разбить функцию на более мелкие. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Наоборот, использование лексических переменных есть признак хорошего кода, т.к. не засоряется глобальное пространство имен. Зачем обявлять глобальной переменную, которая используются в одном конкретном месте? В source фильтре насколько я понял с проходит пред обработка кода как текста перед выполнением... тогда да, найти и корректно обработать все переменные целая история. |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
вы меня не поняли. Я согласен, что глобальные переменные нужно использовать очень ограниченно. Но и лексические переменные разводить не нужно. Если у вас появляется много лексических переменных - вероятно вы просто написали слишком длинную и грамоздкую функцию. Вам нужно разделить ее на более мелкие P.S. я в последнее время вообще стараюсь придерживаться функционального стиля - интесивно использую map, grep циклы-суффиксы, тренарный опператор - ключевое слово my - встречается не более 2 - 3 раз в функции |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Тем не менее есть переменные которые относятся к конкретному участку кода. К примеру из последней программы у меня my $response и my $request содержащие соответственно запрос и ответ LWP (и таких переменных больше, чем глобальных)
Типичный пример, итератор цикла, следовало бы писать так: for(my $i=0; $i<100; $i) {} Правда в случае с $i я все же ее как глобальную пишу, т.к. кроме циклов она ни где не используется. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |