Schrift
[thread]12041[/thread]

Probleme mit require beim optionalen Laden von Modulen

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
j0llyr0g3r
 2008-06-18 16:16
#111201 #111201
User since
2008-06-18
3 Artikel
BenutzerIn
[default_avatar]
Hey ho,

ich hab hier ein Problem mit use und require.

Ich möchte Module bedingt laden, je nach dem welche Option übergeben wird.

Ich dachte folgender Code würde das bewerkstelligen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
GetOptions(
                   'outfile'            => \$out_file,
                   'logfile'            => \$log_file,
           'verbose'            => \$verbose,
           'debug'                      => \$debug,
                   'modules=s@{1,}' => \$scan_modules);

print_args() if $verbose;

# load modules
foreach my $scan_module (@$scan_modules) {
        require $scan_module;
}


Das gibt mir aber folgende Fehlermeldung:

Code (perl): (dl )
Can't locate my_package::my_module in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./inv_unix.pl line 30.


Verwende ich aber ein

Code (perl): (dl )
use my_package::my_module;


fest verdrahtet im source-code funktioniert das.

Wo liegt mein Denkfehler?

In den erwähnten Unterschieden zwischen use und require

------------------------
[nop] * use only expects a bareword, require can take a bareword or an expression
* use is evaluated at compile-time, require at run-time
* use implicitly calls the import method of the module being loaded, require does not
* use excepts arguments in addition to the bareword (to be passed to import), require does not
* use does not behave like a function (i.e can't be called with parens, can't be used in an expression, etc), whereas require does [/nop]
-------------------------

sehe ich nichts was dieses Verhalten erklären würde.....
renee
 2008-06-18 16:18
#111203 #111203
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
foreach my $scan_module (@$scan_modules) {
         (my $tmp = $scan_module) =~ s!::!/!g;
         $tmp .= '.pm';
         require $tmp;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-06-18 16:24
#111205 #111205
Bei require musst du einen Pfad angeben, soweit ich weiß.
Getestet hab ich schnell:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

require 'Tk.pm';
Tk->import();

tkinit();
MainLoop;

Lässt man das .pm beim require weg, kommt genau deine Fehlermeldung.
Ich nehme an, dass die '::' noch durch '/' ersetzt werden müssen, dann ist es eine richtige Pfadangabe.
Code: (dl )
1
2
3
4
5
# load modules
foreach my $scan_module (@$scan_modules) {
$scan_module =~ s#::#/#g;
require $scan_module.'pm';
}


MfG
renee
 2008-06-18 16:28
#111207 #111207
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gast+2008-06-18 14:24:15--
Bei require musst du einen Pfad angeben, soweit ich weiß.
Getestet hab ich schnell:
Code: (dl )
1
2
3
...
require 'Tk.pm';
...

Lässt man das .pm beim require weg, kommt genau deine Fehlermeldung.


Du musst hier unterscheiden zwischen require 'Tk' und require Tk. Tk ist ein Bareword (was erlaubt ist), 'Tk' eben nicht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-06-18 16:33
#111209 #111209
Quote
Du musst hier unterscheiden zwischen require 'Tk' und require Tk. Tk ist ein Bareword (was erlaubt ist), 'Tk' eben nicht...

Ähm, es funktioniert mit beiden nicht ( ist schließlich keine Datei dieses Tk ;), und es scheint beides erlaubt zu sein.
Ich bin mir sicher das du dich hier auf use beziehst:
Quote
* use only expects a bareword, require can take a bareword or an expression

Trotzdem warste mit deiner Antwort schneller als ich, und ich hab nochn Fehler drin. Bei mir fehlt der 2. '.' bei .'.pm' ;)

MfG
Gast Gast
 2008-06-18 16:35
#111210 #111210
Oh nein tut mir Leid *awkward*
Hatte gedacht beides getestet zu haben... mit require Tk klappt es wunderbar.
pq
 2008-06-18 16:45
#111212 #111212
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es geht *entweder*
require Module::Bareword;
*oder*
require 'Module/Path.pm';
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
j0llyr0g3r
 2008-06-18 17:35
#111222 #111222
User since
2008-06-18
3 Artikel
BenutzerIn
[default_avatar]
Uiuiui,

das ging ja schnell.....:-)

Ich hab das jetzt folgendermaßen - nach euren Vorschlägen - gelöst:

Code (perl): (dl )
1
2
3
4
foreach my $scan_module (@$scan_modules) {
        $scan_module =~ s#::#/#g;
        require $scan_module.'.pm';
}


Das läuft 1a....:-)

Eine Frage hab ich allerdings noch:

Rene, du hattest geschrieben:

--------------------
es geht *entweder*
require Module::Bareword;
--------------------

Aber genau das ging doch bei mir nicht (s.o.)?

Herzlichen Dank an Gast und Renee für die Lösungsvorschläge bisher!

P.S.: Wie kann ich denn im Forums-Editor ein "quote" anlegen?
renee
 2008-06-18 17:46
#111224 #111224
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
j0llyr0g3r+2008-06-18 15:35:17--
Rene, du hattest geschrieben:
Das war pq, ich antworte trotzdem mal ;-)
Quote
--------------------
es geht *entweder*
require Module::Bareword;
--------------------

Aber genau das ging doch bei mir nicht (s.o.)?


Du hast kein Bareword sondern eine Variable verwendet. Deswegen geht es nicht.

vgl.
Code: (dl )
1
2
3
4
C:\Perl>perl -e "require Tk"

C:\Perl>perl -e "my $var = 'Tk'; require $var"
Can't locate Tk in @INC (@INC contains: C:\Perl\lib C:\Perl\dev\perllib C:/usr/site/lib C:/usr/lib .) at -e line 1.


Perl sucht nach einer Datei "Tk" (und nicht "Tk.pm") und kann diese natürlich nicht finden...

Quote
P.S.: Wie kann ich denn im Forums-Editor ein "quote" anlegen?


Über "Antwort mit Zitat" oder mit den ganz normalen [quote]-Tags...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
MatthiasW
 2008-06-18 17:47
#111225 #111225
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Quoten kannst du mit: [ quote ] Das Zitat [ /quote ]
Das mit dem require Module::Bareword geht eben nur mit einem Bareword und nicht mit einem Ausdruck.
Eine Variable ( wie bei dir ) ist keine Bareword, sondern ein Ausdruck ( Expression ).

MfG

edit: schon wieder zu langsam^^
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-06-18 16:16.