|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Pavel Kurnosoff 2:5030/736.25 28 Dec 2000 00:00:11 To : All Subject : переменные --------------------------------------------------------------------------------
...в один прекрасный день обычный foreach меня достал своей убогостью. а
именно, мне очень не хватало номера позиции и ее типа (первая, последняя,
внутренняя) в блоке. ладно, пишем свой foreach:
package ForLoop;
use Exporter;
use strict;
use vars qw($pos $npos);
@ForLoop::ISA=qw(Exporter);
@ForLoop::EXPORT=qw(forloop $pos $npos);
sub forloop (&@) {
my $code=shift;
local $_;
# local($npos,$pos);
for ($pos=0;$pos<scalar @_;$pos++) {
if ($pos==0) {
$npos='first';
} elsif ($pos==scalar(@_)-1) {
$npos='last';
} else {
$npos='inner';
}
$_=$_[$pos]; &$code; $_[$pos]=$_;
}
}
1;
пишем тест:
use ForLoop; forloop { printf "%02d: %-5s - $_\n", $pos, $npos; } (1..10);
...и все работает пока не включаю local $pos. тут же $pos и $npos в блоке
становятся undef. а без local - плохо, ибо имена $pos и $npos нельзя назвать
оригинальными и редкоиспользуемыми.
насколько я понимаю, трабл в том, что Exporter создает в том месте, где я
сказал use ForLoop ссылку на $pos и компилятор ее жестко прописывает в код, а
при local реальный адрес переменной изменяется, но тот код об этом не
знает. вопрос, как-нибудь это дело можно обойти?
последнее средство - сделать $_->{value,pos,npos}, но не хотелось бы...
ps: а на самом деле блок - это что? завуалированная процедура что-ли?
--
// pavel kurnosoff
--- Gnus v5.6.45/XEmacs 21.1 - "Bryce Canyon"
* Origin: there's no tomorrow (2:5030/736.25)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/3959aca6490e.html, оценка из 5, голосов 10
|