Sub::Uplevel - apparently run a function in a higher stack frame
use Sub::Uplevel;
sub foo {
print join " - ", caller;
}
sub bar {
uplevel 1, \&foo;
}
#line 11 bar(); # main - foo.plx - 11
THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY
uplevel $num_frames, \&func, @args;
Makes the given function think it's being executed $num_frames higher than the current stack level. So when they use caller($frames) it will actually caller($frames + $num_frames) for them.
"uplevel(1, \&some_func, @_)" is effectively "goto &some_func" but you don't immediately exit the current subroutine. So while you can't do this:
sub wrapper {
print "Before\n";
goto &some_func;
print "After\n";
}
you can do this:
sub wrapper {
print "Before\n";
my @out = uplevel 1, &some_func;
print "After\n";
return @out;
}
use Sub::Uplevel;
my $original_foo = \&foo;
*foo = sub {
my @output = uplevel 1, $original_foo;
print "foo() returned: @output";
return @output;
};
If this code frightens you you should not use this module.
Well, the bad news is uplevel() is about 5 times slower than a normal function call. XS implementation anyone?
Blows over any CORE::GLOBAL::caller you might have (and if you do, you're just sick).
The lesson here is simple: Don't sit next to a Tcl programmer at the dinner table.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
See http://www.perl.com/perl/misc/Artistic.html
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |