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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обратится к области видимости места вызова функции 
:(
    Опции темы
Logo
Дата 22.1.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно ли обратится к области видимости того места, откуда вызвана функция? Что бы эта функция работала с переменными в той области видимости. Как это делают некоторые встроенные функции и операторы, например
Код

  my $_ = "text";
  print;

PM MAIL   Вверх
KSURi
Дата 22.1.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

sub foo {
    for(@_ ? $_[0] : $_) {
        bar();
    }
}

foo(42);
{
    $_ = 24;
    foo();
}

sub bar {
    say;
}



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Logo
Дата 22.1.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обратите внимание на my $_ ... Print работает именно с той областью видимости, в которой он находится.
PM MAIL   Вверх
klem4
Дата 23.1.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не уверен что речь об этом, но может поможет:

Код

our $a = 10;
print &foo;
    
sub foo
{
    my $a = 3;
    return $a * $::a;
}

PM MAIL   Вверх
DurRandir
Дата 24.1.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ответ "вообще" - да, можно. Другой вопрос, зачем вам это надо? Т.к. существует как минимум 3 способа работать с "вышестоящими" переменными. И реальное "залезание вверх по стеку" - мне понадобилось только 1 раз, когда я писал свой стектрейс. Попробуйте описать задачу.
PM   Вверх
mvsgt
Дата 24.1.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(DurRandir @ 24.1.2010,  11:17)
Ответ "вообще" - да, можно. Другой вопрос, зачем вам это надо? Т.к. существует как минимум 3 способа работать с "вышестоящими" переменными. И реальное "залезание вверх по стеку" - мне понадобилось только 1 раз, когда я писал свой стектрейс. Попробуйте описать задачу.

Например иногда надо вставить в модуль функцию, работающую в том же адресном пространстве, что и вызывающая её функция. Но я думаю, что вопрос автора просто неправильно сформулирован и ему хотелось чего-то другого.
PM MAIL   Вверх
Logo
Дата 24.1.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Ответ "вообще" - да, можно. 

Как это сделать? Я не нашел.

Нужно для написания библиотечных функций. Например таких, которые используют переменную по умолчанию $_.  Нужно учесть, что переменная $_ может быть обьявленна как my.
PM MAIL   Вверх
DurRandir
Дата 24.1.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если речь только о $_, то в 5.10 есть прототип "_" - то, что надо. Единственное ограничение - после него не может быть обязательных параметров.
PM   Вверх
Logo
Дата 24.1.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В том то и дело, что список он не принимает.
PM MAIL   Вверх
DurRandir
Дата 25.1.2010, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Т.е. как-то так:

sub bar{}
my @foo = qw();
bar; #и оно как-то узнало, что вызывается с аргументом @foo ?

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

Но если очень хочется прострелить ногу - вуаля - cpan://PadWalker
PM   Вверх
mvsgt
Дата 25.1.2010, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(DurRandir @  25.1.2010,  08:06 Найти цитируемый пост)
Лучше, всегда лучше, явно указывать, что ф-ция принимает в качестве параметров - код должен быть самодокументирущимся.


К сожалению, перл не приспособлен к написанию документации на функции...

А насчёт $_ - уже несколько лет где-то я встречаю рекомендации эту переменную не использовать.
PM MAIL   Вверх
arto
Дата 25.1.2010, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



в смысле "не приспособлен"?
и где вы встречаете такие странные рекомендации?
PM MAIL ICQ   Вверх
mvsgt
Дата 25.1.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arto @  25.1.2010,  09:25 Найти цитируемый пост)
в смысле "не приспособлен"?


Это тема для другого топика.


Цитата(arto @  25.1.2010,  09:25 Найти цитируемый пост)
и где вы встречаете такие странные рекомендации? 


Сходу и не найду где. Но это рекомендации естественные, а не странные. Глобальная переменная, в некоторых версиях перла использование замедляет программу, снижает читаемость. В коротких скриптах использовать удобно, в больших появляются проблемы.

PM MAIL   Вверх
arto
Дата 26.1.2010, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



хотя бы кратко...


в каких версиях?
PM MAIL ICQ   Вверх
mvsgt
Дата 26.1.2010, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(arto @  26.1.2010,  07:45 Найти цитируемый пост)
хотя бы кратко...


Это очевидно для любого, работавшего с php или java, дадаже JavaScript. Попробуйте добиться удобства описания функций и модулей, например в Eclipse, сравнимого с описанием для php, java, javascript.
В POD нет ни единого стиля, ни единых форматов, все описывают как хотят, в результате огромная часть документации нечитаема.

Цитата(arto @  26.1.2010,  07:45 Найти цитируемый пост)
в каких версиях? 


Долго changelog'и читать, не буду.

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


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

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


 




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


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

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