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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     16 Dec 2002  14:17:52
 To : Vadim Belman
 Subject : Re: вопрос про @EXPORT
 -------------------------------------------------------------------------------- 
 
 Vadim Belman wrote:
 
 > Andrey Sapozhnikov wrote:
 >>И у Вас и у предыдущего автора происходит экспорт _всего_ глоба, что
 >>некорректно ибо никто этого не просил и могут быть побочные эффекты.
 >>Представьте, что Вы подключаете два модуля, в одном есть sub xx, а
 >>в другом $xx...
 > 
 >  Дело в том, что это не меняет ситуации. Рекомендую, тесту для, 
 > подключить POSIX (он много экспортит по-дефлоту), и добавить в Вашем 
 > примере печать @EXPORT. С интересом обнаружите, что туда попали все 
 > setuid'ы и прочее.
 > 
 >  Глоб на package - он и есть глоб. Выяснить, откуда в него попал символ 
 > - из собственного пространства имен или запихнуто из другого package - 
 > невозможно.
 
 Еще как меняет. Вот пример экспорта отдельных символов
 из A1 и A2 в main. А про экспорт импортированых символов я
 уже писал. Hе любой импортированый символ можно отличить
 от "родного" (хотя некоторые можно). Поэтом единственное
 решение - импортировать сторонние символы _после_ того,
 как построите список "своих".
 
 ==> A1.pm <==
 
 package A1;
 use base 'Exporter';
 our @EXPORT=qw(&tt);
 sub tt { print "tt called\n"; }
 1;
 
 ==> A2.pm <==
 
 package A2;
 use base 'Exporter';
 our @EXPORT=qw($tt);
 our $tt=30;
 1;
 
 ==> a.pl <==
 
 #!/usr/bin/perl -w
 use strict;
 use A1;
 use A2;
 tt();
 print "$tt\n";
 === EOF ===
 
 Результат выполнения:
 $ ./a.pl
 tt called
 30
 
 То же самое в обратной последовательности:
 
 ==> a.pl <==
 
 #!/usr/bin/perl -w
 use strict;
 use A2;
 use A1;
 tt();
 print "$tt\n";
 === EOF ===
 
 Тот же результат:
 $ ./a.pl
 tt called
 30
 
 А вот что будет если мы экспортируем глобы целиком:
 
 ==> A1.pm <==
 
 package A1;
 use base 'Exporter';
 our @EXPORT=qw(*tt);
 sub tt { print "tt called\n"; }
 1;
 
 ==> A2.pm <==
 
 package A2;
 use base 'Exporter';
 our @EXPORT=qw(*tt);
 our $tt=30;
 1;
 
 ==> a.pl <==
 
 #!/usr/bin/perl -w
 use strict;
 use A1;
 use A2;
 tt();
 print "$tt\n";
 === EOF ===
 
 Экспорт глоба *A2::tt из перетер уже экспортированый *A1::tt :
 $ ./a.pl
 Undefined subroutine &A2::tt called at ./a.pl line 5.
 
 В обратной последовательности:
 
 ==> a.pl <==
 
 #!/usr/bin/perl -w
 use strict;
 use A2;
 use A1;
 tt();
 print "$tt\n";
 === EOF ===
 
 Здесь *A1::tt перетер уже экспортированый *A2::tt :
 $ ./a.pl
 tt called
 Use of uninitialized value in concatenation (.) or string at ./a.pl line 6.
 
 Андрей
 
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: вопрос про @EXPORT   Andrey Sapozhnikov   16 Dec 2002 14:17:52 
Архивное /ru.perl/65778dcb5ecf.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional