[Vienna-pm] Export & Import

Thomas Klausner domm at zsi.at
Sun Aug 17 04:15:44 CDT 2003


Hi!

On Sun, Aug 17, 2003 at 12:56:25AM +0200, Peter J. Holzer wrote:
> Irgendwas habe ich aber offenbar nicht verstanden.
> 
> Ich habe ein Package SysDesc:
> 
>     package SysDesc;
>     @ISA = qw(Exporter);
>     @EXPORT_OK = qw(encode_param);
>     @EXPORT = qw(); 
>     [...]
>     sub encode_param {
> 	 [...]
>     }

schaut OK aus, allerdings wuerde ich das (vor allem in Verbindung mit
mysterioesen Problemen) eher so schreiben:

   package SysDesc;
   use strict;
   use warnings;
   use vars qw(@ISA @EXPORT_OK);
   @ISA = qw(Exporter);
   @EXPORT_OK = qw(encode_param);


> Wenn ich nun ein Script schreibe:
> 
>     use SysDesc qw(encode_param);
>     print encode_param("foo", "bar");
> 
> dann funktioniert das.

scheint logisch.

> Wenn ich aber in einem anderen Package versuche, encode_param zu
> verwenden:
> 
>     package SysDesc::UName;
>     require Exporter;
>     @ISA = qw(Exporter);
>     use SysDesc qw(encode_param);
> 
> 	for (sort keys %$self) {
> 	    $s .= " " . encode_param($_, $self->{$_});
> 	}
> 
> dann meint Perl:
> 
>     Undefined subroutine &SysDesc::UName::encode_param called at ...

Das ist in der Tat seltsam. Ich kann nix falsches sehen. Hast du vielleicht
einen Typo im Code? (strict/warnings!!)

Du koenntest mal in SysDesc::UName deinen Symbol Table ausdrucken, um zu
ueberpruefen, ob du ein entsprechendes Symbol drinnen hast:

  use Data::Dumper;
  print Dumper(\%SysDesc::UName::);

dich interessiert die Zeile:
  encode_param=> *SysDesc::UName::encode_param

Wenn diese Zeile nicht da ist, dann hat der Import nicht geklappt (s.u.)

Und dann kannst du mit B::Deparse noch ein wenig genauer schauen, was dieser
Glob den wirklich ist:

  use B::Deparse;
  $deparse = B::Deparse->new;
  print $deparse->coderef2text(\&SysDesc::UName::encode_param);  

Output sollte sein:

  {
  package SysDesc
  sub encode_param {
 	 [...]
  }

> Aber wenn ich dann noch encode_param in SysDesc in @EXPORT statt
> @EXPORT_OK schreibe, funktionierts. 

@EXPORT wird immer exporitert, waehren @EXPORT_OK nur auf Anfrage:
  use Module @import_list;
  
  
Kann es sein, dass du dich hier verschrieben hast

>     package SysDesc::UName;
>     use SysDesc qw(encode_param);
                    ^^^^^^^^^^^^^^

Und also etwas importieren willst, was nicht exportiert wird (weil's nicht
da ist)? Wobei zumindest mein Perl (5.8.0) in diesem Fall mit
  "fooz" is not exported by the Export1 module
stirbt.

Hmm, seltsame Sache.


-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}



More information about the Vienna-pm mailing list