[Vienna-pm] Export & Import

Marcel Gruenauer marcel at noug.at
Sun Aug 17 07:39:28 CDT 2003


On Sun, Aug 17, 2003 at 01:20:42PM +0200, Peter J. Holzer wrote:

> On 2003-08-17 12:49:49 +0200, Peter J. Holzer wrote:

> Wenn ein Perl-Script zwei Module A und B verwendet (direkt oder
> indirekt), wovon A ein Symbol exportiert, das von B importiert wird,
> dann muss B vor A geladen werden.
> 
> Ist das ein Bug oder ein Feature? Wenn ersteres, warum ist das noch
> niemandem aufgefallen?

In dem exim.tar.gz, das Du mitgeschickt hast, laedt sd zuerst SysDesc. Das
wird in der BEGIN-Phase geladen. Als erstes werden die Statements von
SysDesc.pm ausgefuehrt, die zur BEGIN-Phase laufen, d.h. use(). Also
werden Exporter und SysDesc::UName geladen. Letzteres wiederum laedt,
zur BEGIN-Zeit, SysDesc (schon geladen) und versucht, encode_param zu
importieren. Das Importieren von Symbolen mittels Exporter.pm geschieht
aber nicht zu BEGIN, sondern (glaub ich) zu CHECK. Exporter.pm hatte
naemlich noch keine Gelegenheit, @EXPORT_OK zu sehen.

Das wird deutlich, wenn Du die ersten Zeilen von SysDesc (bis zu 'sub new') ersetzt durch:

    package SysDesc;

    use warnings;
    use strict;
    use base 'Exporter';
    our @EXPORT_OK = qw(encode_param);
    use SysDesc::UName;

welches resultiert in:

    $ ./sd
    "encode_param" is not exported by the SysDesc module
    Can't continue after import errors at SysDesc/UName.pm line 11
    [...]

Wenn Du aber SysDesc::UName zuerst laedst (in sd), dann laedt es SysDesc,
welches Exporter laedt und den gewohnten Weg geht. Das 'use SysDesc'
danach in sd hat dann wenig Wirkung, weil SysDesc schon geladen ist.

Ist alles ein bisserl kompliziert, aber man muss sich einmal die
Reihenfolge, in der bei Perl Dinge geschehen, vergegenwaertigen.

Marcel

-- 
We are Perl. Your table will be assimilated. Your waiter will adapt to
service us. Surrender your beer. Resistance is futile.
 -- London.pm strategy aka "embrace and extend" aka "mark and sweep"



More information about the Vienna-pm mailing list