Variablen aus Modul benutzen
Robert
- perl
Hallöle,
ich will mir eine kleine Bibliothek mit häufiger benötigten Regular Expressions bauen, damit ich zukünftig Korrekturen daran nur noch im Modul, nicht aber in zig Scripts vornehmen muß. Leider scheitere ich aber an meinen Perl-Kenntnissen zu Modulen (hab bisher praktisch nur vordefinierte Module benutzt, keine eigenen).
Hier mal meine zwei zum Testen verwendeten Dateien:
Zuerst das Modul RE.pm:
package RE;
use strict;
use warnings;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw($isodate);
our $isodate = qr/\b\d{4}-\d{2}-\d{2}\b/;
1;
und jetzt das kleine Testscript retest.pl
use strict;
use warnings;
use RE;
foreach ( "AAABBB", "a 2005-02-07 c" )
{
print $_."\n" if m/$RE::isodate/;
}
Anstelle der Ausgabe
a 2005-02-07 c
erhalte ich
Name "RE::isodate" used only once: possible typo at D:\Perl\retest.pl line 6.
Use of uninitialized value in regexp compilation at D:\Perl\retest.pl line 6.
Use of uninitialized value in regexp compilation at D:\Perl\retest.pl line 6.
AAABBB
a 2006-02-11 c
Ok, daß ich beide Strings bekomme, ist eine Folge des uninitialized value, da der tatsächlich genutzte Regular Expression leer ist, also alles matcht.
Was mache ich falsch?
(ja, ich weiß, der RE für das Datum ist noch suboptimal, da auch 1111-99-99 usw. durchgeht - aber das kann und werde ich noch überarbeiten, wenn ich das Ding erstmal überhaupt zum Laufen bekommen habe)
TIA
cu,
Robert
Hallo,
ich will mir eine kleine Bibliothek mit häufiger benötigten Regular Expressions bauen, damit ich zukünftig Korrekturen daran nur noch im Modul, nicht aber in zig Scripts vornehmen muß. Leider scheitere ich aber an meinen Perl-Kenntnissen zu Modulen (hab bisher praktisch nur vordefinierte Module benutzt, keine eigenen).
http://search.cpan.org/~nwclark/perl-5.8.8/lib/Exporter.pm
> package RE;
> use strict;
> use warnings;
> require Exporter;
funktioniert bei mir nicht mit dem strict pragma, da @ISA und @EXPORT nicht definiert sind ->
use vars qw (@ISA @EXPORT);
> @ISA = qw(Exporter);
> @EXPORT = qw($isodate);
generell nicht so gut, ich denke das werden dann bei dir noch ein bis zehn variablen mehr (vgl link). Du solltest anstelle von $EXPORT lieber $EXPORT_OK benutzen.
> our $isodate = qr/\b\d{4}-\d{2}-\d{2}\b/;
> 1;
>
> use strict;
> use warnings;
> use RE;
use RE qw($isodate);
> foreach ( "AAABBB", "a 2005-02-07 c" )
> {
> print $_."\n" if m/$RE::isodate/;
print $_."\n" if m/$isodate/;
#da Exporter, wie du sicherlich schon gelesen hast, die Namen der Exporte direkt in diesen Namespace exportiert.
> }
noch ein Nachsatz, ich würde mir einen eigenen Namespace für meine Module suchen z.B. package Robert::RE; :)
weil z.b. es das "modul" "re - Perl pragma to alter regular expression behaviour" - re.pm gibt.
Das Problem ist folgendes, der Code wird u.U. brechen, wenn das Skript unter z.b. windows ausgeführt wird, weil dort RE.pm und re.pm dasselbe sind.
gruss
Hallöle,
funktioniert bei mir nicht mit dem strict pragma, da @ISA und @EXPORT nicht definiert sind ->
bei mir gabs keine Fehlermeldung, s.u.
generell nicht so gut, ich denke das werden dann bei dir noch ein bis zehn variablen mehr (vgl link). Du solltest anstelle von $EXPORT lieber $EXPORT_OK benutzen.
Mal sehen - wenn ich das richtig verstehe, muß ich die aus EXPORT_OK explizit importieren, die anderen nicht ...
noch ein Nachsatz, ich würde mir einen eigenen Namespace für meine Module suchen z.B. package Robert::RE; :)
weil z.b. es das "modul" "re - Perl pragma to alter regular expression behaviour" - re.pm gibt.
Bingo. Darum bekam ich auch keine Fehlermeldung für mein Modul. Weil das gar nicht benutzt wurde ...+
Danke, jetzt funktionierts.
cu,
Robert
Hi,
bei mir gabs keine Fehlermeldung, s.u.
ja stimmt, ich hatte auch aus reflex require Exporter in use Exporter geändert ;)
Mal sehen - wenn ich das richtig verstehe, muß ich die aus EXPORT_OK explizit importieren, die anderen nicht ...
ja, siehe aber auch %EXPORT_TAGS, welche dir eine Zusammenfassung der Exporte zu Gruppen ermöglicht bis hin zu :all. (z.B. use Robert:RE qw (:datum :geld :common);).
gruss