Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Albert N. MICHEEV                    2:5049/80      23 Jun 2001  11:00:45
 To : Alexander Kostiuchenko
 Subject : package aliasing
 -------------------------------------------------------------------------------- 
 
 
 Пpивет Alexander!
 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 Отвечая на письмо Alexander Kostiuchenko к Albert N. MICHEEV от <21 Июн 01>:
 
  ANM>>> можно ли как-нибyдь создавать алиас для объектного модyля, по
  ANM>>> типy С++ого:    namespace CurrentPart = Codepart::ver1_20;
  AM>> забавный штyкенций полyчился, но чyю гдето недоглядел...
  AM>> package namespace;
 
  AM>>     use namespace qw/File IO::File/;
 
  AK> use namespace File => IO::File;
  AK> так кpасивее ;)
 
 точно. спасибо за кpасивый мысль.
 
 я еще немного фyнкциональности емy добавил, полyчилось вpоде
 очень даже ничего 8)
 
 =======================================================================
 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.
 
 =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";
  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;
 
 =cut
 
 use strict;
 $namespace::VERSION = '0.02';
 sub import{
     my ($slf, $als, $pkg) = (shift, shift, shift);
     my $clr = (caller)[0];
     no strict qw/refs/;
 
     unless( defined @{$als.'::ISA'} ){
         eval sprintf q{package %s; use %s;}, $als, $pkg;
         @{$als.'::ISA'} = $pkg;
     }
 
     my $sub = '';
 
     if( $_[0] and $_[0] eq '()' ){ shift }
     else{
         unshift @_, @{$pkg.'::EXPORT'} if
             defined @{$pkg.'::EXPORT'}
     }
 
     while( my $imp = shift ){
         if( substr($imp, 0, 2) eq '::' ){
             $sub = $imp;
             unless( defined @{$als.$sub.'::ISA'} ){
                 eval sprintf q{package %s;}, $als.$sub;
                 @{$als.$sub.'::ISA'} = $pkg.$sub;
             }
             if( $_[0] and $_[0] eq '()' ){ shift }
             else{ unshift @_, @{$pkg.$sub.'::EXPORT'} if
                 defined @{$pkg.$sub.'::EXPORT'}
             }
         }
         elsif( $imp =~ /^([\$%@])(.+)$/ ){
             *{$als.$sub.'::'.$2} = $1 eq '$' ? \${$pkg.$sub.'::'.$2} :
                $1 eq '@' ? \@{$pkg.$sub.'::'.$2} : \%{$pkg.$sub.'::'.$2};
         }
         elsif( $imp =~ /^:(.+)$/ ){
             unshift @_, @{(\%{$pkg.$sub.'::EXPORT_TAGS'})->{$1}};
         }
         else{
             *{$clr.'::'.$imp} = *{$als.$sub.'::'.$imp} =
                 \&{$pkg.$sub.'::'.$imp};
         }
     }
 }
 
 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/18593b343ed0.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional