Schrift
[thread]10223[/thread]

erstes eigenes modul -> anfängerproblem

Leser: 1


<< >> 8 Einträge, 1 Seite
belor
 2007-08-26 19:40
#98693 #98693
User since
2007-06-19
5 Artikel
BenutzerIn
[Homepage] [default_avatar]
guten abend,

ich wollte zum parsen von für mysql gefährlichen symbolen "<" etc. ein modul schreiben.

allerdings habe ich ein allgemeins verständisproblem.

das gleiche beispiel innerhalb einer subfunktion funktioniert perfekt.
was mache ich denn bei diesem modul falsch?

mfg
belor

modul:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
package control;

use strict;

sub param {
my $daten = shift();
$daten =~ s/a/b/gi;

return($daten);
}

1;


test programm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use eigene::control;

my $daten = "a";

print "daten: $daten\n";
print "-----\n";
&control::param("$daten");
print "daten: $daten\n";


ausgabe:
Code: (dl )
1
2
3
daten: a
-----
daten: a
Ronnie
 2007-08-26 19:52
#98694 #98694
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Du verwendest use strict;, du solltest auch use warnings; verwenden. Deine Methode param gibt die modifizierte Variable zurück, aber du verwendest die Funktion in einem void-Kontext. Dein Problem kannst du lösen in dem du es so schreibst:
Code (perl): (dl )
$daten = &control::param($daten);

Du könntest auch eine Referenz verwenden, oder eine globale Variable - da sparst du dir die Zuweisung, aber beides ist kein guter Programmierstil (außer du weißt genau wieso du es so machst).

Tipp: Wenn du DBI und Platzhalter verwendest um auf MySQL zuzugreifen, kannst du dir das ganze sparen, weil DBI das sicherer machen kann als du.
Struppi
 2007-08-26 23:29
#98698 #98698
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Erstmal gibt es wie schon angedeutet eine Funktion im DBI Modul dafür, dann ist das '&' Zeichen im Funktionsaufruf veraltet und sollte nicht mehr verwendet werden, dann ist so ein Konstrukt "$daten" ebenfalls nicht zu empfehlen, da du damit das Programm unnötig verlangsamst (wenn auch nur wenig)

Prinzipiell würde dein Skript so laufen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w
package control;

use strict;

sub param {
        my $daten = shift();
        $$daten =~ s/a/b/gi;
}
package main;
use strict;
my $daten = "a";
print "daten: $daten\n";
print "-----\n";
control::param(\$daten);
print "daten: $daten\n";
pq
 2007-08-26 23:41
#98702 #98702
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Ronnie+2007-08-26 17:52:57--
Tipp: Wenn du DBI und Platzhalter verwendest um auf MySQL zuzugreifen, kannst du dir das ganze sparen, weil DBI das sicherer machen kann als du.

genau, siehe hier: Wiki:DbiPlatzhalter
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
kristian
 2007-08-27 22:22
#98726 #98726
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Ich glaube hier wird an der Fragestellung - siehe Titel - vorbei geantwortet.
Als Quelle zum Lesen könnten: "perldoc perlmod" und
Zitat aus diesem:
--------------------------------------------------------------------------------------------------------
See perlmodlib for general style issues related to building Perl mod-
ules and classes, as well as descriptions of the standard library and
CPAN, Exporter for how Perl's standard import/export mechanism works,
perltoot and perltooc for an in-depth tutorial on creating classes,
perlobj for a hard-core reference document on objects, perlsub for an
explanation of functions and scoping, and perlxstut and perlguts for
more information on writing extension modules.
--------------------------------------------------------------------------------------------------------
sinnvoll sein.

Als Beispiel für den Anfänger könnte:

- Modul:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package MyFirstModul;
use strict;

sub new{
    my $pkg  = shift;
    my $self = {};
    bless $self, ref $pkg || $pkg;
    return $self;      
}

sub replace{
    my $self = shift;
    my $data = shift;
    $data =~ s/a/b/gi;
    return $data;    
}

1;

- Script:
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
#!/usr/bin/perl
$|++;
use strict;
use warnings;
use FindBin;
use File::Spec;

# Verzeichnis / Ordner fuer eigene Module einbinden
my $lib_dir = File::Spec->catdir($FindBin::Bin, 'mylibs'); 
unshift(@INC,$lib_dir);

# Eignes Modul "laden"
require MyFirstModul; # MyFirstModul.pm gespeichert in /wo_das_Script_ist/mylibs

# Eigenes Modul einbinden
my $lets_do = new MyFirstModul;

# Daten am Anfang + Ausgabe
my $string = 'Hallo World';
print $string . "\n";

# Modul benutzen => Daten aendern + Ausgabe
my $new_string = $lets_do->replace($string);
print $new_string . "\n";

sinnvoll sein.

Gruss
Kristian
bloonix
 2007-08-28 18:22
#98785 #98785
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
kristian+2007-08-27 20:22:36--
Ich glaube hier wird an der Fragestellung - siehe Titel - vorbei geantwortet.

so schauts aus, aber du hast auch vergessen, den Beitrag von Ronnie zu lesen,
denn anstonsten hätttest du "use warnings;" im Modul stehen :p
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-08-28 18:27
#98786 #98786
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
kristian+2007-08-27 20:22:36--
- Modul:
Code (perl): (dl )
    $data =~ s/a/b/gi;

warum nicht
Code (perl): (dl )
tr/aA/b/;

? :-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
belor
 2007-08-29 00:55
#98798 #98798
User since
2007-06-19
5 Artikel
BenutzerIn
[Homepage] [default_avatar]
vielen dank für die vielen antworten.

damit hätte ich jetzt wirklich nicht gerechnet.
vorallem vielen dank für den tipp mit den dbi platzhaltern,
dadurch erübrigt sich zwar mein modul, aber ich hab dafür wieder einiges interessantes gelernt.


schönen abend noch
belor
<< >> 8 Einträge, 1 Seite



View all threads created 2007-08-26 19:40.