晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /usr/share/perl5/ |
Upload File : |
package autouse;
#use strict; # debugging only
use 5.006; # use warnings
$autouse::VERSION = '1.11';
$autouse::DEBUG ||= 0;
sub vet_import ($);
sub croak {
require Carp;
Carp::croak(@_);
}
sub import {
my $class = @_ ? shift : 'autouse';
croak "usage: use $class MODULE [,SUBS...]" unless @_;
my $module = shift;
(my $pm = $module) =~ s{::}{/}g;
$pm .= '.pm';
if (exists $INC{$pm}) {
vet_import $module;
local $Exporter::ExportLevel = $Exporter::ExportLevel + 1;
# $Exporter::Verbose = 1;
return $module->import(map { (my $f = $_) =~ s/\(.*?\)$//; $f } @_);
}
# It is not loaded: need to do real work.
my $callpkg = caller(0);
print "autouse called from $callpkg\n" if $autouse::DEBUG;
my $index;
for my $f (@_) {
my $proto;
$proto = $1 if (my $func = $f) =~ s/\((.*)\)$//;
my $closure_import_func = $func; # Full name
my $closure_func = $func; # Name inside package
my $index = rindex($func, '::');
if ($index == -1) {
$closure_import_func = "${callpkg}::$func";
} else {
$closure_func = substr $func, $index + 2;
croak "autouse into different package attempted"
unless substr($func, 0, $index) eq $module;
}
my $load_sub = sub {
unless ($INC{$pm}) {
require $pm;
vet_import $module;
}
no warnings qw(redefine prototype);
*$closure_import_func = \&{"${module}::$closure_func"};
print "autousing $module; "
."imported $closure_func as $closure_import_func\n"
if $autouse::DEBUG;
goto &$closure_import_func;
};
if (defined $proto) {
*$closure_import_func = eval "sub ($proto) { goto &\$load_sub }"
|| die;
} else {
*$closure_import_func = $load_sub;
}
}
}
sub vet_import ($) {
my $module = shift;
if (my $import = $module->can('import')) {
croak "autoused module $module has unique import() method"
unless defined(&Exporter::import)
&& ($import == \&Exporter::import ||
$import == \&UNIVERSAL::import)
}
}
1;
__END__
=head1 NAME
autouse - postpone load of modules until a function is used
=head1 SYNOPSIS
use autouse 'Carp' => qw(carp croak);
carp "this carp was predeclared and autoused ";
=head1 DESCRIPTION
If the module C<Module> is already loaded, then the declaration
use autouse 'Module' => qw(func1 func2($;$));
is equivalent to
use Module qw(func1 func2);
if C<Module> defines func2() with prototype C<($;$)>, and func1() has
no prototypes. (At least if C<Module> uses C<Exporter>'s C<import>,
otherwise it is a fatal error.)
If the module C<Module> is not loaded yet, then the above declaration
declares functions func1() and func2() in the current package. When
these functions are called, they load the package C<Module> if needed,
and substitute themselves with the correct definitions.
=begin _deprecated
use Module qw(Module::func3);
will work and is the equivalent to:
use Module qw(func3);
It is not a very useful feature and has been deprecated.
=end _deprecated
=head1 WARNING
Using C<autouse> will move important steps of your program's execution
from compile time to runtime. This can
=over 4
=item *
Break the execution of your program if the module you C<autouse>d has
some initialization which it expects to be done early.
=item *
hide bugs in your code since important checks (like correctness of
prototypes) is moved from compile time to runtime. In particular, if
the prototype you specified on C<autouse> line is wrong, you will not
find it out until the corresponding function is executed. This will be
very unfortunate for functions which are not always called (note that
for such functions C<autouse>ing gives biggest win, for a workaround
see below).
=back
To alleviate the second problem (partially) it is advised to write
your scripts like this:
use Module;
use autouse Module => qw(carp($) croak(&$));
carp "this carp was predeclared and autoused ";
The first line ensures that the errors in your argument specification
are found early. When you ship your application you should comment
out the first line, since it makes the second one useless.
=head1 AUTHOR
Ilya Zakharevich (ilya@math.ohio-state.edu)
=head1 SEE ALSO
perl(1).
=cut