Learning Perl Objects, References amp;amp; Modules [Electronic resources] نسخه متنی

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

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

Learning Perl Objects, References amp;amp; Modules [Electronic resources] - نسخه متنی

Randal L. Schwartz

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

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

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














2.7 Packages as Namespace Separators


If
the name prefix of the last example didn't have to
be spelled out on every use, things would work much better. Well, you
can improve the situation by using a package:

package Navigation;
sub turn_towards_heading {
.. code here ..
}
sub turn_towards_port {
.. code here ..
}
1;

The package declaration at the beginning of this
file tells Perl to insert Navigation:: in front of
most names within the file: Thus, the code above practically says:

sub Navigation::turn_towards_heading {
.. code here ..
}
sub Navigation::turn_towards_port {
.. code here ..
}
1;

Now when Gilligan uses this file, he simply adds
Navigation:: to the subroutines defined in the
library, and leaves the Navigation:: prefix off
for subroutines he defines on his own:

#!/usr/bin/perl
require 'navigation.pl';
sub turn_toward_port {
Navigation::turn_toward_heading(compute_heading_to_island( ));
}
sub compute_heading_to_island {
.. code here ..
}
.. more program here ..

Package names are like variable names:
they consist of alphanumerics and underscores, as long as you
don't begin with a digit. Also, for reasons
explained in the perlmodlib documentation, a
package name should begin with a capital letter and not overlap an
existing CPAN or core module name. Package names can also consist of
multiple names separated by double colons, such as
Minnow::Navigation and
Minnow::Food::Storage.

Nearly every scalar, array, hash,
subroutine, and filehandle name[9] is
actually prefixed by the current package, unless the name already
contains one or more double-colon markers.

[9] Except lexicals, as
you'll see in a moment.


So, in
navigation.pl, you can use variables such as:

package Navigation;
@homeport = (21.1, -157.525);
sub turn_toward_port {
.. code ..
}

(Trivia note: 21.1 degrees north, 157.525 degrees west is the
location of the real-life marina where the opening shot of a famous
television series was filmed.)

You can refer to the @homeport variable in the
main code as:

@destination = @Navigation::homeport;

If every name has a package name inserted in
front of it, what about names in the main program? Yes, they are also
in a package, called main. It's
as if package main; were at the
beginning of each file. Thus, to keep Gilligan from having to say
Navigation::turn_towards_heading, the
navigation.pl file can say:

sub main::turn_towards_heading {
.. code here ..
}

Now the subroutine is defined in the main package,
not the Navigation package. This
isn't an optimal solution (you'll
see better solutions in Chapter 12), but at least
there's nothing sacred or terribly unique about
main compared to any other package.


/ 199