Paket-Wirrniss: Wo liegt mein trivialer Fehler?

Paket-Wirrniss: Wo liegt mein trivialer Fehler?

am 10.01.2007 18:43:48 von frank

Hallo,

Beim Versuch ein Minimalbeispiel für ein anderes Problem zu erzeugen bin
ich auf etwas gestoßen, was ich nicht verstehe. Ein Skript verwendet
mit "use tpmmini;" eine Kopie 'tpmmini.pm' eines existierende Perlmoduls
'tpm2debcommon.pm', in dem ich einen Fehler jagen möchte. Mit dem
Original funktioniert das Skript, mit der Kopie beschwert sich der
Compiler über

Global symbol "%TpmData" requires explicit package name at ./mini.pl line 14.

Der hash %TpmData ist in beiden Modulen mit our deklariert und mit
Exporter exportiert.[1]

Hier die Details:

$ diff -u tpmmini.pm tpm2debcommon.pm
$ ls -l tpmmini.pm tpm2debcommon.pm
-rwxr-xr-x 1 frank frank 23587 2007-01-10 20:30 tpm2debcommon.pm
-rwxr-xr-x 1 frank frank 23587 2007-01-10 20:31 tpmmini.pm
$ cat mini.pl
#!/usr/bin/perl -w

use strict;
# use diagnostics;
# no strict 'refs';
use warnings;
use Storable;

use tpmmini;
# use tpm2debcommon;

initialize_config_file_data("tpm2deb.cfg");
my $tpmdataref = retrieve("tpm.data");
%TpmData = %{$tpmdataref};


build_data_hash();
$ ./mini.pl
Global symbol "%TpmData" requires explicit package name at ./mini.pl line 14.
Execution of ./mini.pl aborted due to compilation errors.

Wenn ich nun folgendes mache

-use tpmmini;
-# use tpm2debcommon;
+# use tpmmini;
+use tpm2debcommon;

Dann läuft es durch, macht des gesuchten Fehler und druckt diverse
Diagnostik, mit der ich ihn schon vergeblich zu finden gesucht habe.

Wie kann sowas kommen?

TIA, Frank

[1] ich denke es ist keine gute Idee, eine Variable im Hauptprogramm zu
belegen und zu verwenden, die im Modul deklariert wird, zumal sie im
Modul gar nicht verwendet wird. Aber bevor ich das Modul schön mache,
soll es erst mal funktionieren.

--
(17:00:03) ***joeyh loves that install-info uses $'
(17:00:34) Yoe: what's $' again?
(17:00:49) joeyh: shorthand for make your perl program slow at the
expense of readability

Re: Paket-Wirrniss: Wo liegt mein trivialer Fehler?

am 10.01.2007 19:06:25 von frank

Frank Küster wrote:

> Hallo,
>
> Beim Versuch ein Minimalbeispiel für ein anderes Problem zu erzeugen bin
> ich auf etwas gestoßen, was ich nicht verstehe. Ein Skript verwendet
> mit "use tpmmini;" eine Kopie 'tpmmini.pm' eines existierende Perlmoduls
> 'tpm2debcommon.pm', in dem ich einen Fehler jagen möchte. Mit dem
> Original funktioniert das Skript, mit der Kopie beschwert sich der
> Compiler

Offensichtlicher Fehler gefunden, es ist eben die Tatsache, dass sich
die beiden Module nicht unterscheiden.

-package tpm2debcommon;
+package tpmmini;

hilft...

Gruß, Frank
--
(17:00:03) ***joeyh loves that install-info uses $'
(17:00:34) Yoe: what's $' again?
(17:00:49) joeyh: shorthand for make your perl program slow at the
expense of readability

Re: Paket-Wirrniss: Wo liegt mein trivialer Fehler?

am 10.01.2007 19:17:06 von Phil

Am Wed, 10 Jan 2007 23:13:48 +0530 schrieb Frank Küster:

> Hallo,
>
> Beim Versuch ein Minimalbeispiel für ein anderes Problem zu erzeugen bin
> ich auf etwas gestoßen, was ich nicht verstehe. Ein Skript verwendet
> mit "use tpmmini;" eine Kopie 'tpmmini.pm' eines existierende Perlmoduls
> 'tpm2debcommon.pm', in dem ich einen Fehler jagen möchte. Mit dem
> Original funktioniert das Skript, mit der Kopie beschwert sich der
> Compiler über
>
> Global symbol "%TpmData" requires explicit package name at ./mini.pl line 14.

Evtl. wird in tpm2debcommon.pm ein Namespace deklariert mit:

package tpm2debcommon;

das müsstest Du für tpmmini.pm ändern in

package tpmmini;

sonnst kannst Du auch auf den Hash zugreifen, wenn Du den
Namespace explizit angibst und in mini.pl statt %TpmData
%tpm2debcommon::TpmData verwendest.


Wenn die Variablen per Exporter exportiert werden, solltest Du sie
eigentlich auch direkt verwenden können, der Import muss dann aber
definiert werden:

use tpmmini qw(%TpmData);


HTH, Phil

Re: Paket-Wirrniss: Wo liegt mein trivialer Fehler?

am 10.01.2007 19:23:50 von Phil

Am Wed, 10 Jan 2007 23:13:48 +0530 schrieb Frank Küster:

> initialize_config_file_data("tpm2deb.cfg");
> my $tpmdataref = retrieve("tpm.data");
> %TpmData = %{$tpmdataref};

was passiert wenn Du auch %TpmData dem Package 'main' bekanntmachst:

my %TpmData = %{$tpmdataref};


Wald, Bäume...

Re: Paket-Wirrniss: Wo liegt mein trivialer Fehler?

am 11.01.2007 09:01:28 von Ferry Bolhar

Frank Küster:

> $ diff -u tpmmini.pm tpm2debcommon.pm

Der Modul (Dateiname) muss immer gleich dem Packagenamen
sein, sonst funktioniert der Exporter nicht.

Im obigen "diff" muss also zumindest die Zeile mit der "package"
Direktive als unterschiedlich ausgewiesen werden. Das ist nicht
der Fall, daher musst du in tpmmini.pm die "package" Direktive
entsprechend anpassen.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at