|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : yurik shestakov 2:5020/400 09 Jun 2004 17:23:49 To : Alexander Kostiuchenko Subject : Re: name from reference -------------------------------------------------------------------------------- On Tue, Jun 08, 2004 at 02:53:47PM +0400, Alexander Kostiuchenko wrote: ys>> Чего-то я не уловил сути в данной реализации, особенно две вещи: ys>> 1) grep {/^$/} keys %$vars -- ты чего тут хочешь получить? AK> имена всех скалярных переменных (естессно, вместо $ там \$) ys>> 2) не понятно, что сделает ext("$_"). AK> пример вызова функции, осуществляющей биндинг (у меня ext(&) по-другому AK> называется, имена случайно совпали, когда код в самом письме правил) Ага, все ясно. AK>>> Оказалось - PadWalker не умеет создавать переменные caller'a, AK>>> только модифицировать. Да и strict пришлось бы отключать... ys>> IMHO без грубого вмешательства во внутренности Perl такое ys>> не провернуть. AK> Вот как раз и было интересно, как вмешаться.... Я из интереса сам попробовал разобраться с работой "атрибутов".... По ходу дела понял, что мне не обязательно знать имя переменной, мне передается в "Attribute::Handlers" ссылка на переменную. Далее с этой ссылкой я могу сделать хоть bless, хоть tie, хоть то и другое последовательно. AK>>> Более-менее подходит вариант с local our $name. Хотя это не совсем AK>>> то - из-за "побочного эффекта" с dynamical scoping. Так что вопрос AK>>> все еще в силе. ys>> p.s. Что-то у меня такое чувство, что без tie тут не обойтись. AK> У tie недостаток есть - нельзя обьявить сразу несколько связанных AK> переменных (т.е. сделать аналог my ($a,$b,@c) : Tied). AK> И фиг бы с ним, если б хоть в этом AK> случае была возможность избежать передачи строки с именем переменной. AK> А с local our тоже проблема вылезла - в 5.6 для таких переменных аттрибуты AK> просто игнорируются (не вызывается обработчик; в 5.8 все работает). Можно, у меня получилось с использованием модуля Attribute::Handlers. К примеру, у меня есть модуль ix::dec, к-й есть wrapper вокрут либы informix для работы с decimal (двоично-десятичная арифметика). Обычно я им пользовался так: my $x = new ix::dec 10; # создавалась строка, в к-й хранился собственно # dec_t, и на которую делался bless $dec, 'ix::dec'; Вчера добавил две вещи: 1. Функция TIESCALAR -- реально вызывает то же new(). 2. Добавил в dec.pm пару строк: use Attribute::Handlers autotie => { DEC => __PACKAGE__ } sub UNIVERSAL::DEC : ATTR(SCALAR) { my ($package, $symbol, $referent, $attr, $data, $phase) = @_; my @data = ref $data eq 'ARRAY' ? @$data : $data; # print "UNIVERSAL::DEC() tie($referent) to @data\n"; tie $$referent, 'ix::dec', @data; } Использовать просто: my $x : DEC = 1.111; # сначала позовется TIESCALAR/new, потом STORE my ($x, $y, $z) : DEC(2.2); # TIESCALAR/new с аргументом 2.2 на всех # переменных по очереди Отладочный вывод: UNIVERSAL::DEC() tie(SCALAR(0x8178af0)) to 2.2 dec.pm: TIESCALAR(ix::dec 2.2) ix::dec::new() class=ix::dec ix::dec::new(2.2) has double arg UNIVERSAL::DEC() tie(SCALAR(0x8178b08)) to 2.2 dec.pm: TIESCALAR(ix::dec 2.2) ix::dec::new() class=ix::dec ix::dec::new(2.2) has double arg UNIVERSAL::DEC() tie(SCALAR(0x8178b20)) to 2.2 dec.pm: TIESCALAR(ix::dec 2.2) ix::dec::new() class=ix::dec ix::dec::new(2.2) has double arg -- // yurik shestakov --- ifmail v.2.15dev5.3 * Origin: Unknown (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/100691e2fbaf9.html, оценка из 5, голосов 10
|