|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Albert N. MICHEEV 2:5049/80 25 Jun 2001 22:43:30 To : Vladimir Zhebelev Subject : package aliasing -------------------------------------------------------------------------------- Ïpèâåò Vladimir! ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Îòâå÷àÿ íà ïèñüìî Vladimir Zhebelev ê All îò <24 Èþí 01>: VZ> À ÷åì ýòî ëy÷øå ÷åì "$main::{'File::'} = *IO::File::;"? ò.å. òû ïpåäëàãàåøü àëèàñèòü â ïîäïpîñòpàíñòâî caller'à? äyìàåøü òàê ëîãè÷íåå áyäåò? à âîîáùå åùå èìïîpò èì¸í ïåpåìåííûõ è ñyááypàòèíîâ ïpîñòàíñòâà èìååòñÿ, íàïpèìåp îáúÿâëåííûõ êàê êîíñòàíòû. ê òîìy æå äåëàòü âñå îäíîé ñòpîêîé ëy÷øå íàâåpíîå? VZ> Êpîìå òîãî, êàê îíî áyäåò pàáîòàòü â ñëy÷àå íåñêîëüêèõ 'use VZ> namespace'? òåïåpü âûçûâàåòñÿ äèé VZ> Ïëþñ êy÷à ñèòyàöèé, ãäå îíî íå áyäåò pàáîòàòü èëè áyäåò VZ> pàáîòàòü êpèâî, íàïpèìåp: ïîïpîáyé ñ íèæå ïpèâåäåííîé âåpñèåé 0.03 VZ> Ïëþñ îòñyòñòâèå 'sub unimport' à íàäî? æåâàòü òâîþ ôàíòàçèþ. ÿ âåäü ïîä ñâîè íyæíû íàïpèäyìûâàë. â îáùåì-òî è ýòî çàïpîñòî... VZ> ïpèñyòñòâèå 'eval sprintf'... ÿ yápàë. òîëüêî require â ýâàë çàêëþ÷èë, ÷òîáû íå ìàòþãàëñÿ åñëè íå íàéäåò, êàê â òâîåì ñëy÷àå. ================================================================== package namespace; =head1 NAME namespace - Perl pragma to use like C++ namespace aliasing =head1 SYNOPSIS use namespace File => IO::File; my $fh = new File "foo", O_CREAT|O_WRONLY; if( defined $fh ) { print $fh "bar\n"; $fh->close; } =head1 DESCRIPTION Allow aliasing namespace. May be useful for reusability increase. use namespace ALIAS => PACKAGE [, qw/IMPORT_LIST [ ::SUBPACKAGE [ IMPORT_LIST ]] /]; ALIAS and PACKAGE is required parameters; IMPORT_LIST is the usual list of import. NOTE! The the names of variables will be imported to ALIAS or ALIAS::SUBPACKAGE namespace. And the names of functions will be imported also to caller package. Also may be undefined namespace and they subnamespaces: no namespace ALIAS; =head1 EXAMPLES EXAMPLE 1 use namespace DOM => XML::DOM, qw/$VERSION ::Document $VERSION/; # DOM is alias for XML::DOM # $VERSION from XML::DOM will be imported to DOM # # ::Document subpackage of XML::DOM will be aliased to DOM::Document # $VERSION from XML::DOM::Document will be imported to DOM::Document my $doc = new DOM::Document; print "Current used DOM version is $DOM::VERSION \n"; no namespace DOM; # namespace DOM and all subnamespaces will be destroyed EXAMPLE 2 use namespace DOM => XML::DOM, qw/::Document/; # or # use namespace DOM => XML::Sablotron::DOM, qw/:constants ::Document/; my $doc = new DOM::Document; print "Constant 'TEXT_NODE' = ", TEXT_NODE; =head1 AUTHOR Albert MICHEEV <Albert@f80.n5049.z2.fidonet.org> =cut use strict; $namespace::VERSION = '0.03'; sub import{ my ($slf, $als, $pkg) = (shift, shift, shift); my $clr = (caller)[0]; no strict qw/refs/; die "Package '$als' already defined!" if defined %{$als.'::'}; eval "require $pkg" unless defined %{$pkg.'::'}; @{$als.'::ISA'} = $pkg; if( @_ and $_[0] eq '()' ){ shift } else{ unshift @_, @{$pkg.'::EXPORT'} if defined @{$pkg.'::EXPORT'} } my ($Pkg, $Als) = ($pkg, $als); while( my $imp = shift ){ if( substr($imp, 0, 2) eq '::' ){ $Pkg = $pkg.$imp; $Als = $als.$imp; @{$Als.'::ISA'} = $Pkg; if( @_ and $_[0] eq '()' ){ shift } else{ unshift @_, @{$Pkg.'::EXPORT'} if defined @{$Pkg.'::EXPORT'} } } elsif( $imp =~ /^([\$%@])(.+)$/ ){ *{$Als.'::'.$2} = $1 eq '$' ? \${$Pkg.'::'.$2} : $1 eq '@' ? \@{$Pkg.'::'.$2} : \%{$Pkg.'::'.$2}; } elsif( $imp =~ /^:(.+)$/ ){ unshift @_, @{ ${$Pkg.'::'}{EXPORT_TAGS}{$1} }; } else{ *{$clr.'::'.$imp} = *{$Als.'::'.$imp} = \&{$Pkg.'::'.$imp}; } } } sub unimport{ my $self = shift; no strict qw/refs/; undef %{shift().'::'}; } 1; --- ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ * Origin: Ìû èç Ñîâåòñêîãî Ñîþçà, ïpèáûëè ïî êyëüòypíîìy îáìåíy. (2:5049/80) Âåðíóòüñÿ ê ñïèñêó òåì, ñîðòèðîâàííûõ ïî: âîçðàñòàíèå äàòû óìåíüøåíèå äàòû òåìà àâòîð
Àðõèâíîå /ru.perl/18593b379029.html, îöåíêà èç 5, ãîëîñîâ 10
|