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-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |