Getopt::Long verwenden, um @INC zu erweitern
Getopt::Long verwenden, um @INC zu erweitern
am 25.01.2007 22:04:20 von frank
Hallo,
ich habe da ein Perl-Skript, das anderer Leute Daten (eine
Verzeichnishierarchie mit vielen Dateien) verarbeitet.
Freundlicherweise liefern die ein Modul mit, das viele Aufgaben schon
erledigt. Ich kann aber den Ort, wo diese Daten liegen, in meinem
Skript nicht fest eincodieren, sondern muss ihn als Kommandozeilenoption
übergeben - das gilt also auch für den Ort, an dem ich mit "use" das
Modul laden möchte.
In folgendem Skript funktioniert das sogar, nur der Rest der Optionen
nicht:
********************************
#!/usr/bin/perl
use warnings;
use strict;
my $dir = "default";
my $whatever = "alsodefault";
# our $whatever = "alsodefault";
BEGIN {
use Getopt::Long;
use Data::Dumper;
GetOptions(
"dir=s" => \$dir,
"whatever=s" => \$whatever
# "whatever=s" => \$main::whatever
);
unshift(@INC,"./$dir");
}
use Mytest;
print "$Mytest::hallo\n";
print "Irgendwas: $whatever\n";
********************************
Irgendwas ist an @INC besonders, und hätte ich länger gesucht, hätte ich
die Stelle sicher auch gefunden, an der steht dass es eine globale
Variable ist oder so.
Jetzt bin ich auf der Suche nach einer Möglichkeit, die restlichen
Optionen (oben also $whatever) auch von der Kommandozeile zu bekommen.
Einfach "use strict;" streichen und das "my" vor $whatever gefällt mir
nicht, vor allem aber hilft es nichts...
Wer gibt mir ein Stichwort?
TIA, 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: Getopt::Long verwenden, um @INC zu erweitern
am 25.01.2007 23:34:20 von Slaven Rezic
Frank Küster writes:
> Hallo,
>
> ich habe da ein Perl-Skript, das anderer Leute Daten (eine
> Verzeichnishierarchie mit vielen Dateien) verarbeitet.
> Freundlicherweise liefern die ein Modul mit, das viele Aufgaben schon
> erledigt. Ich kann aber den Ort, wo diese Daten liegen, in meinem
> Skript nicht fest eincodieren, sondern muss ihn als Kommandozeilenoption
> übergeben - das gilt also auch für den Ort, an dem ich mit "use" das
> Modul laden möchte.
>
> In folgendem Skript funktioniert das sogar, nur der Rest der Optionen
> nicht:
>
> ********************************
> #!/usr/bin/perl
>
> use warnings;
> use strict;
>
> my $dir = "default";
> my $whatever = "alsodefault";
> # our $whatever = "alsodefault";
>
> BEGIN {
> use Getopt::Long;
> use Data::Dumper;
>
> GetOptions(
> "dir=s" => \$dir,
> "whatever=s" => \$whatever
> # "whatever=s" => \$main::whatever
> );
> unshift(@INC,"./$dir");
>
> }
>
>
> use Mytest;
>
> print "$Mytest::hallo\n";
> print "Irgendwas: $whatever\n";
> ********************************
>
> Irgendwas ist an @INC besonders, und hätte ich länger gesucht, hätte ich
> die Stelle sicher auch gefunden, an der steht dass es eine globale
> Variable ist oder so.
>
> Jetzt bin ich auf der Suche nach einer Möglichkeit, die restlichen
> Optionen (oben also $whatever) auch von der Kommandozeile zu bekommen.
> Einfach "use strict;" streichen und das "my" vor $whatever gefällt mir
> nicht, vor allem aber hilft es nichts...
>
> Wer gibt mir ein Stichwort?
>
Compile-time vs. Run-time. Es sieht so aus, als ob du mit den beiden
my-Zeilen am Anfang die Variablen früh setzt, aber zur Compile-time
wird nur deklariert, aber nicht der Default gesetzt. Danach wird der
BEGIN-Block ausgeführt, danach "use Mytest". Es folgt nun die
Run-time, und erst jetzt werden die beiden Variablen $dir und
$whatever gesetzt.
Lösung: die Deklaration weiterhin oben lassen, das Initialisieren der
Variablen in den BEGIN-Block verschieben.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Dump a Tk canvas as an xfig file:
http://search.cpan.org/search?mode=module&query=Tk::CanvasFi g
Re: Getopt::Long verwenden, um @INC zu erweitern
am 26.01.2007 07:00:34 von Frank Seitz
Frank Küster wrote:
> Wer gibt mir ein Stichwort?
Ich hab's mir mehrfach durchgelesen, ich verstehe nicht,
worin Dein Problem besteht.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Getopt::Long verwenden, um @INC zu erweitern
am 26.01.2007 08:33:18 von frank
Frank Seitz wrote:
> Frank Küster wrote:
>
>> Wer gibt mir ein Stichwort?
>
> Ich hab's mir mehrfach durchgelesen, ich verstehe nicht,
> worin Dein Problem besteht.
Das Problem ist, dass die Kommandozeilenoption "--whatever" wirkungslos
ist. Mit so einem Mytest.pm:
#!/usr/bin/perl
use strict;
use warnings;
package Mytest;
use Exporter();
my @ISA = qw( Exporter );
my @EXPORT_OK = qw($hallo);
our $hallo = "hallo";
erhält man:
$ bin/perl/incchange-getopt --dir=testINCdir --whatever=Dummkopf
hallo
Irgendwas: alsodefault
$
Es soll aber "Irgendwas: Dummkopf" ausgegeben werden.
my $dir = "default";
my $whatever = "alsodefault";
BEGIN {
use Getopt::Long;
GetOptions(
"dir=s" => \$dir,
"whatever=s" => \$whatever
);
unshift(@INC,"./$dir");
}
Hier wird $whatever offenbar nur im Kontext des BEGIN-Blocks verändert,
jedenfalls ist es außerhalb unverändert.
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: Getopt::Long verwenden, um @INC zu erweitern
am 26.01.2007 09:35:49 von frank
Slaven Rezic wrote:
> Compile-time vs. Run-time. Es sieht so aus, als ob du mit den beiden
> my-Zeilen am Anfang die Variablen früh setzt, aber zur Compile-time
> wird nur deklariert, aber nicht der Default gesetzt. Danach wird der
> BEGIN-Block ausgeführt, danach "use Mytest". Es folgt nun die
> Run-time, und erst jetzt werden die beiden Variablen $dir und
> $whatever gesetzt.
Ja, so ist es logisch. So logisch, dass man sich hinterher wundert,
warum man nicht gleich darauf gekommen ist.
> Lösung: die Deklaration weiterhin oben lassen, das Initialisieren der
> Variablen in den BEGIN-Block verschieben.
Jep, das isses dann wohl.
Dankeschön,
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: Getopt::Long verwenden, um @INC zu erweitern
am 26.01.2007 09:49:33 von Ferry Bolhar
Frank Küster:
> my $dir = "default";
> my $whatever = "alsodefault";
> # our $whatever = "alsodefault";
Diese Zuweisungen passieren erst _zur Laufzeit_, daher...
> BEGIN {
> use Getopt::Long;
> use Data::Dumper;
>
> GetOptions(
> "dir=s" => \$dir,
> "whatever=s" => \$whatever
> # "whatever=s" => \$main::whatever
> );
> unshift(@INC,"./$dir");
>
> }
überschreiben sie die Zuweisungen, die GetOptions (über die
Referenzen) vorher im BEGIN-Block macht. Durch das Ablegen
von $dir ins globale Array @INC rettest du diesen Wert, aber
der von $whatever wird zur Laufzeit vom Defaultwert wieder
überschrieben.
"my" deklariert eine Variable für den Compiler als lexikalisch,
aber wenn du Werte zuweist, passiert das erst zur _Laufzeit_.
Du kannst dir den BEGIN-Block sparen, wenn du statt der
Compiler-Anweisung "use" die Laufzeitanweisung "require"
verwendest:
use strict;
use warnings;
use Getopt::Long;
my $dir = 'default';
my $whatever = 'whatever';
GetOptions('dir=s' => \$dir, 'whatever=s' => \$whatever);
unshift @INC,"./$dir";
require Mytest;
Mytest->import if Mytest->can('import');
print "Whatever: $whatever\n";
"require" geht genauso den @INC-Path durch (und berücksichtigt
auch %INC), wie "use", nur eben zur Laufzeit.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Getopt::Long verwenden, um @INC zu erweitern
am 26.01.2007 12:22:46 von frank
"Ferry Bolhar" wrote:
> Du kannst dir den BEGIN-Block sparen, wenn du statt der
> Compiler-Anweisung "use" die Laufzeitanweisung "require"
> verwendest:
Das ist ja sogar noch besser...
> "require" geht genauso den @INC-Path durch (und berücksichtigt
> auch %INC), wie "use", nur eben zur Laufzeit.
Ich hatte noch nie über require nachgelesen, und bin davon ausgegangen
es sei dafür da, ein Modul schadlos zweimal anfordern zu können (eine
Art "use if not already used".
Gelegenheit mich zu bilden, und zu danken,
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