Schrift
[thread]12333[/thread]

Fehler in meinem ersten Perl Script

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Kingpin90
 2008-08-10 21:49
#113291 #113291
User since
2008-08-10
7 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe mich in den letzten Tagen etwas mit Perl beschäftigt und heute mein erstes Script zusammen gebastelt.
Leider sind in dem Script noch einige Fehler und demzufolge startet es nicht.

Wäre echt nett wenn mal jemand dürber gucken würde und mir sagt, wo ich noch nachbessern muss.

Vielen Dank in vorraus.

Kingpin90

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#! /usr/bin/perl

use strict;
use warnings;
use DBI;

my $user = 'username';
my $pass = 'userpasswort';
my $db = 'datenbankname';
my $host = 'localhost';
my $driver = “DBI:mysql:$db:$host“;
my $dbh = DBI->connect($driver,$user,$pass) or die $DBI::errstr;

my $quelle = 
my $ziel = 

my $aktuell = 1;

#########################################
#### Zieltabelle erstellen           ####
#########################################

print "Erstelle Zieltabelle...";

my $erstellen = CREATE TABLE $ziel (
                `ANREDE` varchar(10) default NULL,
                `VORNAME` varchar(255) default NULL,
                `NAME` varchar(255) default NULL,
                `ZUSATZ` varchar(255) default NULL,
                `STRASSE` varchar(50) default NULL,
                `HAUSNR` varchar(10) default NULL,
                `STRASSE HAUSNR` varchar(10) default NULL,
                `ORTSTEIL` varchar(50) default NULL,
                `D` varchar(1) default NULL,
                `PLZ` varchar(5) default NULL,
                `ORT` varchar(50) default NULL,
                `TELZUSATZ` varchar(10) default NULL,
                `VORWAHL` varchar(10) default NULL,
                `TELEFON` varchar(30) default NULL,
                `VORWAHL TELEFON` varchar(30) default NULL
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

my $sth = $dbh->prepare($erstellen) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;

print "OK \n";

#########################################
#### Anzahl der Quelldaten           ####
#########################################

print "Stelle Anzahl der Quelldaten fest...";

my $quelldaten = 'SELECT COUNT * FROM $quelle';

my $sth = $dbh->prepare($guelldaten) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;
$gesamt=$sth->fetchrow_array;

print "OK \n";

#########################################
#### Quelldaten laden                ####
#########################################

print "Lade Quelldaten aus Tabelle...";

my $quelldaten = 'SELECT * FROM $quelle';

my $sth = $dbh->prepare($guelldaten) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;
$zeiger = $dbh->selectall_arrayref($quelldaten);

print "OK \n";

#########################################
#### Beginn der Datenverarbeitung    ####
#########################################

print "Beginne mit der Verarbeitung der Daten...";
print "OK \n";

foreach $felder(@$zeiger)
{
    @ergebnis=@$felder;

my $abfrage =   INSERT INTO $ziel
                SELECT
                $quelle.ANREDE,
                $quelle.VORNAME,
                $quelle.NAME,
                $quelle.ZUSATZ,
                $quelle.STRASSE,
                $quelle.HAUSNR,
                $quelle.`STRASSE HAUSNR`,
                $quelle.ORTSTEIL,
                $quelle.D,
                $quelle.PLZ,
                $quelle.ORT,
                $quelle.TELZUSATZ,
                $quelle.VORWAHL,
                $quelle.TELEFON,
                $quelle.`VORWAHL TELEFON`,
                FROM
                $quelle
                WHERE
                $quelle.PLZ = $ergebnis[1] AND
                $quelle.STRASSE = $ergebnis[2] AND
                $quelle.HAUSNR = $ergebnis[3];

my $sth = $dbh->prepare($abfrage) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;

my $aktuell = $aktuell +1;

print "Bearbeite Datensatz $aktuell von $gesamt \n";
}
Linuxer
 2008-08-10 21:57
#113292 #113292
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

nur fix drübergeguckt:

falsche Begrenzer in Zeile 11: keine echten Gänsefüsse (vgl. Highlighting Zeile 23)
Zuweisungsfehler in Zeile 14 und 15; was soll in $quelle und $ziel rein?

Fehler in Zeile 25;
Es fehlen die Stringbegrenzer; Vorschlag:

Code: (dl )
1
2
3
4
5
my $erstellen = <<"BEGRENZER_DER_NICHT_IM_SQLCODE_VORKOMMT";
CREATE TABLE $ziel ....
DEIN SQL CODE
DEIN SQL CODE
BEGRENZER_DER_NICHT_IM_SQLCODE_VORKOMMT


Gleicher Fehler (wie in Zeile 25) in Zeile 87...
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!
Kingpin90
 2008-08-10 23:11
#113294 #113294
User since
2008-08-10
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

danke für deine schnelle Antwort.
Mein Script sieht inzischen so aus:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#! /usr/bin/perl

use strict;
use warnings;
use DBI;

my $user = perl;
my $pass = perl;
my $db = klicktel;
my $host = localhost;
my $driver = "DBI:mysql:$db:$host";
my $dbh = DBI->connect($driver,$user,$pass) or die $DBI::errstr;

my $quelle = "perl";
my $ziel = "perl";

my $aktuell = 1;

#########################################
#### Zieltabelle erstellen           ####
#########################################

print "Erstelle Zieltabelle...";

my $erstellen = "CREATE TABLE $ziel (
                `ANREDE` varchar(10) default NULL,
                `VORNAME` varchar(255) default NULL,
                `NAME` varchar(255) default NULL,
                `ZUSATZ` varchar(255) default NULL,
                `STRASSE` varchar(50) default NULL,
                `HAUSNR` varchar(10) default NULL,
                `STRASSE HAUSNR` varchar(10) default NULL,
                `ORTSTEIL` varchar(50) default NULL,
                `D` varchar(1) default NULL,
                `PLZ` varchar(5) default NULL,
                `ORT` varchar(50) default NULL,
                `TELZUSATZ` varchar(10) default NULL,
                `VORWAHL` varchar(10) default NULL,
                `TELEFON` varchar(30) default NULL,
                `VORWAHL TELEFON` varchar(30) default NULL
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8";

my $sth = $dbh->prepare($erstellen) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;

print "OK \n";

#########################################
#### Anzahl der Quelldaten           ####
#########################################

print "Stelle Anzahl der Quelldaten fest...";

my $quelldaten = 'SELECT COUNT * FROM $quelle';

my $sth = $dbh->prepare($guelldaten) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;
$gesamt=$sth->fetchrow_array;

print "OK \n";

#########################################
#### Quelldaten laden                ####
#########################################

print "Lade Quelldaten aus Tabelle...";

my $quelldaten = "SELECT * FROM $quelle";

my $sth = $dbh->prepare($guelldaten) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;
$zeiger = $dbh->selectall_arrayref($quelldaten);

print "OK \n";

#########################################
#### Beginn der Datenverarbeitung    ####
#########################################

print "Beginne mit der Verarbeitung der Daten...";
print "OK \n";

foreach $felder(@$zeiger)
{
    @ergebnis=@$felder;

my $abfrage =   "INSERT INTO $ziel
                SELECT
                $quelle.ANREDE,
                $quelle.VORNAME,
                $quelle.NAME,
                $quelle.ZUSATZ,
                $quelle.STRASSE,
                $quelle.HAUSNR,
                $quelle.`STRASSE HAUSNR`,
                $quelle.ORTSTEIL,
                $quelle.D,
                $quelle.PLZ,
                $quelle.ORT,
                $quelle.TELZUSATZ,
                $quelle.VORWAHL,
                $quelle.TELEFON,
                $quelle.`VORWAHL TELEFON`,
                FROM
                $quelle
                WHERE
                $quelle.PLZ = $ergebnis[1] AND
                $quelle.STRASSE = $ergebnis[2] AND
                $quelle.HAUSNR = $ergebnis[3]";

my $sth = $dbh->prepare($abfrage) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;

my $aktuell = $aktuell +1;

print "Bearbeite Datensatz $aktuell von $gesamt \n";
}


Die Fehlermeldungen sind erheblich weniger geworden.
Nun tauchen immer noch folgende Meldungen auf:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ks359263:/daten# clear
root@ks359263:/daten# perl cmag_mysql.pl
"my" variable $sth masks earlier declaration in same scope at cmag_mysql.pl line 56.
"my" variable $quelldaten masks earlier declaration in same scope at cmag_mysql.pl line 68.
"my" variable $sth masks earlier declaration in same scope at cmag_mysql.pl line 70.
Global symbol "$guelldaten" requires explicit package name at cmag_mysql.pl line 56.
Global symbol "$gesamt" requires explicit package name at cmag_mysql.pl line 58.
Global symbol "$guelldaten" requires explicit package name at cmag_mysql.pl line 70.
Global symbol "$zeiger" requires explicit package name at cmag_mysql.pl line 72.
Global symbol "$felder" requires explicit package name at cmag_mysql.pl line 83.
Global symbol "$zeiger" requires explicit package name at cmag_mysql.pl line 83.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 85.
Global symbol "$felder" requires explicit package name at cmag_mysql.pl line 85.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 87.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 87.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 87.
Global symbol "$gesamt" requires explicit package name at cmag_mysql.pl line 116.
Bareword "perl" not allowed while "strict subs" in use at cmag_mysql.pl line 7.
Bareword "perl" not allowed while "strict subs" in use at cmag_mysql.pl line 8.
Bareword "klicktel" not allowed while "strict subs" in use at cmag_mysql.pl line 9.
Bareword "localhost" not allowed while "strict subs" in use at cmag_mysql.pl line 10.
Execution of cmag_mysql.pl aborted due to compilation errors.
root@ks359263:/daten#
pktm
 2008-08-10 23:29
#113295 #113295
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Du hast innerhlab eines Codeblocks (alles das, was auf einer Ebene in einer Perl-Datei steht ist ein Codeblock für sich) mehrfach $sth deklaiert, und zwar in Zeile 43,070,56 111 usw.
Entweder, du benennst die Variablen jedesmal anders, z.B. $sth_insert_sth und $sth_select_x, oder du lagster Codestücke in Methoden aus.

Beispiel:

Code: (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
# Verbindung zur Datenbank herstellen
my $dbh = DBI->connect(blabla,nimm,mal,dein,passwort,raus);

# Methoden aufrufen, die irgend etwas mit der Datenbank machen.
do_something($dbh);

# jetzt noch was mit Rückgabewert:
my $rv = do_something_else($dbh);
print $rv;

=head1 METHODS

Deine Methoden hier.


=head2 do_someting

Beschreibung, was du machst....

=cut

sub do_someting {
my $dbh = shift;

my $sth = $dbp->prepare(dein statement) or die "fehler...";
my $rv = $sth->...... usw.

} # /do_something



=head2 do_someting_else

Beschreibung, was du machst....

=cut

sub do_someting_else {
my $dbh = shift;

my $sth = $dbp->prepare(dein statement) or die "fehler...";
my $rv = $sth->...... usw.

return "ergebnis";
} # /do_something_else


Edit:
Btw, das Modul CPAN:SQL::Abstract bietet sich dir quasi an, und um die Zugangsdaten zu deiner Datenbank aus deinen Skripten heraus zu halten kannst du schön mit CPAN:Config::Auto arbeiten.

Hier noch ein schnelles Beispiel:
main.config
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/perl/bin/perl

my %CONFIG = ();

$CONFIG{dsn} = 'dbi:Oracle:localhost';
$CONFIG{username} = 'testbenutzername';
$CONFIG{password} = 'testpasswort';

\%CONFIG;


dein Programm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Config::Auto;

my $config = Config::Auto::parse('main.config');

my $dsn = $config->{dsn};
my $username = $config->{username};
my $password = $config->{password};
my $options = { AutoCommit => 1, };

my $dbh = DBI->connect($dsn, $username, $password, $options) or die "cannot connect to db: " . DBI::errstr();

# mach was mit $dbh

$dbh->disconnect();
http://www.intergastro-service.de (mein erstes CMS :) )
Kingpin90
 2008-08-10 23:41
#113296 #113296
User since
2008-08-10
7 Artikel
BenutzerIn
[default_avatar]
Danke, das mit den doppelt deklarierten Variablen habe ich nun in Ordnung gebracht.

Kannst du mir nun auch noch die Ursache für folgende Fehler nennen?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@ks359263:/daten# clear
root@ks359263:/daten# perl cmag_mysql.pl
syntax error at cmag_mysql.pl line 15, near "$sth
my "
Global symbol "$erstellen" requires explicit package name at cmag_mysql.pl line 16.
Global symbol "$erstellen" requires explicit package name at cmag_mysql.pl line 30.
Global symbol "$erstellen" requires explicit package name at cmag_mysql.pl line 48.
Global symbol "$guelldaten" requires explicit package name at cmag_mysql.pl line 61.
Global symbol "$gesamt" requires explicit package name at cmag_mysql.pl line 63.
Global symbol "$guelldaten" requires explicit package name at cmag_mysql.pl line 75.
Global symbol "$zeiger" requires explicit package name at cmag_mysql.pl line 77.
Global symbol "$felder" requires explicit package name at cmag_mysql.pl line 88.
Global symbol "$zeiger" requires explicit package name at cmag_mysql.pl line 88.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 90.
Global symbol "$felder" requires explicit package name at cmag_mysql.pl line 90.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 92.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 92.
Global symbol "@ergebnis" requires explicit package name at cmag_mysql.pl line 92.
Global symbol "$gesamt" requires explicit package name at cmag_mysql.pl line 121.
Execution of cmag_mysql.pl aborted due to compilation errors.
root@ks359263:/daten#
pktm
 2008-08-10 23:56
#113298 #113298
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Dafür brauche ich nochmal deine aktuelle Version und die aktuellen Fehlermeldungen dazu :)

Es sieht aber ganz danach aus, als müsstest du die Variablen innerhalb der Methoden noch verfügbar machen.
Hast du eine Methode, die auf die Variable $erstellen zugreifen muss? Wenn ja, dann musst du diese Variable auch innerhalb der Methode deklarieren.

Also so in der Art:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Variante 1: Die Variable wird nur in 1 Methode benötigt:
# Aufruf: my_method($dbh);
sub my_method {
my $dbh = shift; # das kennen wir schon, das nimmt $dbh als 1. Argument entgegeben

my $in_dieser_methode_gueltige_variable = "blubb";

} # /my_method

# Variante 2: Die Variable wird mehrfach verwendet, $dbh ist so ein Fall.
# Aufruf: my_meth2($dbh, $meine_bereits_deklarierte_variable);
sub my_meth2 {
my $dbh = shift;
my $argument = shift; # neu: ein zweites Argument wird eingelesen!
# das ist etwas, was du dort deklariert hast, wo du die Methode aufrufst.
} # /my_meth2


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Linuxer
 2008-08-10 23:59
#113300 #113300
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Kingpin90+2008-08-10 21:41:20--
Code: (dl )
1
2
syntax error at cmag_mysql.pl line 15, near "$sth
my "


Ich würde mal um die Zeile 15 schauen, da scheint mir der Bock begraben. (Semikolon vergessen?)

Ansonsten fällt mir nur ein:

Sehr böse als root zu entwickeln und dann die Sachen auch als root laufen zu lassen.
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!
pktm
 2008-08-11 00:02
#113301 #113301
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Linuxer+2008-08-10 21:59:43--
Sehr böse als root zu entwickeln und dann die Sachen auch als root laufen zu lassen.

Tja, das ist halt das tolle an der Freiheit bei Linux. Man kann machen was man will :-p
http://www.intergastro-service.de (mein erstes CMS :) )
Kingpin90
 2008-08-11 00:09
#113302 #113302
User since
2008-08-10
7 Artikel
BenutzerIn
[default_avatar]
hattest recht. hatten 4 semikolons gefehlt...
pktm
 2008-08-11 00:11
#113303 #113303
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Kingpin90+2008-08-10 22:09:47--
hattest recht. hatten 4 semikolons gefehlt...


Wenn es nun funktioniert wäre es toll, wenn du deine Lösung für in Zukunft Suchende posten würdest.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2008-08-10 21:49.