Thread unblessed reference (4 answers)
Opened by silver345 at 2011-06-07 08:44

silver345
 2011-06-07 08:44
#149486 #149486
User since
2011-06-07
16 Artikel
BenutzerIn
[default_avatar]
Ich muß für meinen Job ein Script schreiben, um XML Files in eine MySQL-Datenbank zu übertragen. Dazu nutze ich unter anderem prepared statements.

Code: (dl )
1
2
my $SqlTools = "SELECT `value` FROM `Tools` WHERE `property`=?";
my $SqlSthTools = $dbh->prepare($SqlTools);


Wenn diese Statements (die SELECT-Anweisungen, also record sets, enthalten), nicht am Ende des Programms geschlossen werden, beschwert sich Perl. Zu recht. Also habe ich eine Routine geschrieben, die diese RecordSets schließt.

Code: (dl )
1
2
3
4
5
sub closeDatabase {
$SqlSthTools->finish();
# usw.
$dbh->disconnect;
}


Da ich aber noch bei der Entwicklung bin und ich die Sache schrittweise aufbaue, steigt die Zahl der zu schließenden RS und Murphy ist überall. Deshalb dachte ich in meinem Altersleichtsinn, daß ich diese Variablen per Referenz an ein Array übergebe

Code: (dl )
1
2
3
my @toClose = ();

push @toClose, \$SqlSthTools;


und dann in o. g. Routine schließe.

Code: (dl )
1
2
3
4
5
6
sub closeDatabase {
foreach my $sth (@toClose) {
$sth->finish();
}
$dbh->disconnect;
}


Das führt aber zur Fehlermeldung:

Can't call method "finish" on unblessed reference at <script_name> line <number>.

Nutze ich hingegen folgendes Szenario:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @toClose = ();

push @toClose, "SqlSthTools";

sub closeDatabase {
foreach my $sth (@toClose) {
my $cmd = '$' . $sth . '->finish()';
eval $cmd;
}
$dbh->disconnect;
}


gibt es zumindest keine Fehlermeldung. Jetzt bin ich mir aber nicht wirklich sicher, ob wirklich 1. die RS geschlossen werden und 2. eval nicht als guter Geist funktioniert und die Fehlermeldungen unterdrückt.

Lieber wäre mir jedoch der Aufruf über das Array mit den Variablen-Refenrenzen. Ist wohl auch irgendwie professioneller (wenn ich es denn könnte ;o) ). Kann mir da jemand einen Tipp geben?
Last edited: 2011-06-07 08:51:28 +0200 (CEST)

View full thread unblessed reference