Ãëàâíàÿ ñòðàíèöà


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)
 
 

Âåðíóòüñÿ ê ñïèñêó òåì, ñîðòèðîâàííûõ ïî: âîçðàñòàíèå äàòû  óìåíüøåíèå äàòû  òåìà  àâòîð 

 Òåìà:    Àâòîð:    Äàòà:  
 package aliasing   Albert N. MICHEEV   19 Jun 2001 23:00:43 
 package aliasing   Albert N. MICHEEV   20 Jun 2001 12:42:57 
 package aliasing   Alexander Kostiuchenko   21 Jun 2001 09:04:29 
 package aliasing   Albert N. MICHEEV   23 Jun 2001 11:00:45 
 Re: package aliasing   Vladimir Zhebelev   24 Jun 2001 19:56:26 
 package aliasing   Albert N. MICHEEV   25 Jun 2001 22:43:30 
Àðõèâíîå /ru.perl/18593b379029.html, îöåíêà 1 èç 5, ãîëîñîâ 10
ßíäåêñ.Ìåòðèêà
Valid HTML 4.01 Transitional