| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 не писать, переменная будет 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 | ||
Наоборот, использование лексических переменных есть признак хорошего кода, т.к. не засоряется глобальное пространство имен. Зачем обявлять глобальной переменную, которая используются в одном конкретном месте? В source фильтре насколько я понял с проходит пред обработка кода как текста перед выполнением... тогда да, найти и корректно обработать все переменные целая история. |
| Автор: Logo 6.10.2009, 16:31 |
| Тем не менее есть переменные которые относятся к конкретному участку кода. К примеру из последней программы у меня my $response и my $request содержащие соответственно запрос и ответ LWP (и таких переменных больше, чем глобальных) Типичный пример, итератор цикла, следовало бы писать так: for(my $i=0; $i<100; $i) {} Правда в случае с $i я все же ее как глобальную пишу, т.к. кроме циклов она ни где не используется. |