Thread Prüfen ob ein Package definiert ist? (6 answers)
Opened by Linuxer at 2019-11-20 19:31

Linuxer
 2019-11-20 19:31
#190909 #190909
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

ich kann ja mehrere packages innerhalb eines Skriptes definieren und später benutzen.
Nun stellt sich mir gerade die Frage, ob ich im main prüfen kann, welche packages definiert worden sind, bzw. ob ein bestimmtes package definiert ist?

Hier ein Beispiel-Code, der mit Workaround auf Linux funktioniert:

skript.pl (6.9kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#! /usr/bin/perl
use strict;
use warnings;
use 5.020;

package foo;

sub foo { }
sub dummy { }


package bar;

sub bar { }
sub dummy { }



package main;

use File::Basename;

# Das Original Skript heisst meinetwegen skript.pl
# soll aber unter diversen Namen mit verschiedenen Funktionen aufgerufen werden
# z.B. via SymLinks oder Hardlinks
#   ln skript.pl foo           # hard linked
#   ln -s skript.pl bar        # symlinked
#   ln -s skript.pl not_defined
#
# Die verschiedenen Funktionen sollen oben in den packages definiert werden
#
# Zum Start sollte aber geprüft werden, ob das "aufgerufene" Package überhaupt definiert worden ist.

# ermittle gewünschtes Package
my $called_as = File::Basename::basename($0);


# Als Workaround könnte ich in jedem Package eine Dummy Funktion definieren und prüfen,
# ob die vorhanden ist; wenn ja, gilt die Annahme, dass das Package korrekt definiert ist
# (ist oben bereits so gemacht).

if ( ! $called_as->can("dummy") ) {
  die "(E) Aufruf als '$called_as' zur Zeit noch nicht unterstützt.\n";
}
# Das hat halt den Nachteil, dass ich diese dummy Funktion eben in jedem Package definiert haben muss.
# Es ist noch nicht abzusehen, ob ich eine "sinnvolle" Funktion in allen Packages haben werde, die 
# überall den gleichen Namen haben wird.


#### Schöner fände ich einen direkten Check, ob das package definiert ist; etwas dieser Art
#if ( ! package_exists($called_as) ) {
#  die "(E) Aufruf als '$called_as' zur Zeit noch nicht unterstützt.\n";
#}

### Hier geht's dann weiter mit der gewünschten Ausführung...

say "Yes! We can run as $called_as.";

# ...

__END__



Ausgeführt:
Ausgaben (1.1kb):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 ll -lisa
total 16K
1047210 4.0K drwxrwsr-x. 2 a422548 apache 4.0K Nov 20 18:23 .
1047702 4.0K drwxr-sr-x. 4 a422548 apache 4.0K Nov 20 18:21 ..
1047318 0 lrwxrwxrwx. 1 a422548 apache 9 Nov 20 18:21 bar -> skript.pl
1047351 4.0K -rwxrwxr-x. 2 a422548 apache 1.3K Nov 20 18:23 foo
1047356 0 lrwxrwxrwx. 1 a422548 apache 9 Nov 20 18:21 not_defined -> skript.pl
1047351 4.0K -rwxrwxr-x. 2 a422548 apache 1.3K Nov 20 18:23 skript.pl
$ perl foo
Yes! We can run as foo.
$ perl bar
Yes! We can run as bar.
$ perl not_defined
(E) Aufruf als 'not_defined' zur Zeit noch nicht unterstützt.
$ perl skript.pl
(E) Aufruf als 'skript.pl' zur Zeit noch nicht unterstützt.
$



Momentan bräuchte ich es als packages in einer Datei.
Ich weiß, ich könnte zu jedem Package eine eigene Datei erstellen und diese dann versuchen zu laden und dieses auf Erfolg prüfen.

Aber derzeit interessiert mich eben die Frage, ob ich prüfen kann, dass ein bestimmter Namensraum per package definiert wurde oder nicht.

Hoffe, ich konnte mein Anliegen ausreichend erklären.


Ideen? Hinweise? Übersehe ich etwas?


edit: more-Tags eingebaut; Tippfehler verjagt
Last edited: 2019-11-21 00:01:47 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Prüfen ob ein Package definiert ist?