Модераторы: 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   Вверх
DurRandir
Дата 26.1.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



>работавшего с php
smile:
PM   Вверх
arto
Дата 26.1.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perldoc perlpod не помогает?

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

не могли бы вы показать мне аналог perldoc -m для java?


ну хотя бы покажите мне рекомендацию не использовать $_...

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


Опытный
**


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

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



DurRandir спасибо, то что надо.

Цитата(mvsgt @  25.1.2010,  09:21 Найти цитируемый пост)

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

Не глобальная а локализованная везде, где можно. Теперь вот и локальной может быть, хотя от этого ИМХО только неприятности. Читаемость может улучшать, а может снижать, это уж как использовать. В больших скриптах тоже можно использовать, но только не надо далеко разносить ее заполнение значением и обработку. Это действительно снижает читаемость и чревато ошибкам. Юзать ее надо рядом с местом локализации, тогда читаемость улучшается.
На счет замедления в некоторых версиях тоже в первый раз слышу.
 

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


Бывалый
*


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

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



Простой тест:
Код

#!perl -w
use strict;
use English;
use Benchmark ;
printf "OS name: %s, Perl version: %vd\n" ,$OSNAME, $PERL_VERSION;
my $count = 100000;
my $tests = 100;

Benchmark::cmpthese(
    $tests,
    {
        '$_:' => sub {
            foreach ( 1 .. $count ) {
                $_ = $_ . '';
            }
        },
        '$i:' => sub {
            foreach my $i ( 1 .. $count ) {
                $i = $i . '';
            }

        },
    }
);

print "\n" , '-'  x 60, "\n\n";



Результаты:
Код

OS name: MSWin32, Perl version: 5.6.1
Benchmark: timing 100 iterations of $_:, $i:...
       $_::  6 wallclock secs ( 5.81 usr +  0.00 sys =  5.81 CPU) @ 17.20/s (n=100)
       $i::  5 wallclock secs ( 4.88 usr +  0.00 sys =  4.88 CPU) @ 20.51/s (n=100)
      Rate  $_:  $i:
$_: 17.2/s   -- -16%
$i: 20.5/s  19%   --

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

OS name: MSWin32, Perl version: 5.10.0
      Rate  $_:  $i:
$_: 17.3/s   -- -26%
$i: 23.4/s  36%   --

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

OS name: linux, Perl version: 5.10.0
      Rate  $_:  $i:
$_: 15.7/s   -- -39%
$i: 25.8/s  64%   --

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


Разница заметна?

А есть ещё my $_ и our $_ - и результат будет тоже интересный, особенно в разных версиях.

Это сообщение отредактировал(а) mvsgt - 26.1.2010, 23:07
PM MAIL   Вверх
Logo
Дата 26.1.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пока не зачет. Замените либо $_ на my, либо $i на our. Результаты сравняются.
Код

foreach my $_ ( 1 .. $count ) { #...
foreach our $i ( 1 .. $count ) { #...

А так это доказывает лишь то, что лексические переменные здесь быстрее, чем динамические.
PM MAIL   Вверх
mvsgt
Дата 27.1.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а сделайте-ка мне my $_ в 5.6 . Получится? Я не зря писал про некоторые версии и тестировал именно эти самые некоторые, в которых ещё не было my $_.
$_ имеет смысл упоминать именно в том виде, в котором её все знают. Иначе встретятся чудеса (пример ниже), когда возникает потребность понять что за $_ будет использована. И тестировать производительность имеет смысл для тех случаев, которые встречаются в жизни. my $_ - не встречается.

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


Опытный
**


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

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



Цитата

а сделайте-ка мне my $_ в 5.6 . Получится? 

Там просто $i сделайте динамической и протестируйте.

Цитата

И тестировать производительность имеет смысл для тех случаев, которые встречаются в жизни. my $_ - не встречается.

 smile Наоборот - ты проверяешь, какие результаты, а на основании них делаешь вывод о том, будет ли нечто встречаться у тебя в жизни, или нет.


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


Бывалый
*


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

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



Цитата(Logo @  27.1.2010,  13:14 Найти цитируемый пост)
Там просто $i сделайте динамической и протестируйте.


то есть я  должен начать доказывать утверждение, которого я не делал? Зачем?

Цитата(Logo @  27.1.2010,  13:14 Найти цитируемый пост)
Цитата

И тестировать производительность имеет смысл для тех случаев, которые встречаются в жизни. my $_ - не встречается.

 smile Наоборот - ты проверяешь, какие результаты, а на основании них делаешь вывод о том, будет ли нечто встречаться у тебя в жизни, или нет.


Наоборот - я залез в мою установку перла и посмотрел, сколько модулей использует my $_ - один модуль, причём я так и не понял зачем. Так вот, я сначала сделал предположение, затем его проверил. Это правильный путь. Вы же ни того, ни другого не сделали. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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