Perl Cd Bookshelf [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Perl Cd Bookshelf [Electronic resources] - نسخه متنی

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید



10.15. Trapping Undefined Function Calls with AUTOLOAD


10.15.1. Problem





You want to intercept calls to
undefined functions so you can handle them gracefully.

10.15.2. Solution


Declare a function
called AUTOLOAD for the package whose undefined
function calls you'd like to trap. While running, that package's
$AUTOLOAD variable contains the name of the
undefined function being called.

10.15.3. Discussion


Another strategy for creating similar functions is to use a proxy
function. If you call an undefined function, instead of automatically
raising an exception, you can trap the call. If the function's
package has a function named AUTOLOAD, then this
function is called in its place, with the special package global
$AUTOLOAD set to the package-qualified function
name. The AUTOLOAD subroutine can then do whatever
that function would do.

sub AUTOLOAD {
my $color = our $AUTOLOAD;
$color =~ s/.*:://;
return "<FONT COLOR='$color'>@_</FONT>";
}
#note: sub chartreuse isn't defined.
print chartreuse("stuff");

When the nonexistent main::chartreuse function is
called, rather than raising an exception,
main::AUTOLOAD is called with the same arguments
as you passed chartreuse. The package variable
$AUTOLOAD would contain the string
main::chartreuse because that's the function it's
proxying.

The technique using typeglob assignments shown in Recipe 10.14 is faster and more flexible than using
AUTOLOAD. It's faster because you don't have to
run the copy and substitute. It's more flexible because it lets you
do this:

{
local *yellow = \&violet;
local (*red, *green) = (\&green, \&red);
print_stuff( );
}

While print_stuff( ) is running, including from
within any functions it calls, anything printed in yellow will come
out violet, and the red and green texts will exchange colors.

Aliasing subroutines like this won't handle calls to undefined
subroutines. AUTOLOAD does.

10.15.4. See Also


The section on "Autoloading" in Chapter 10 of Programming
Perl
and in perlsub(1); the
documentation for the standard modules AutoLoader and AutoSplit;
Recipe 10.12; Recipe 12.11; Recipe 13.12



10.14. Redefining a Function10.16. Nesting Subroutines




Copyright © 2003 O'Reilly & Associates. All rights reserved.

/ 875