Schrift
[thread]12455[/thread]

select antwort als hash speichern

Leser: 1


<< >> 8 Einträge, 1 Seite
Yato
 2008-09-08 15:39
#114352 #114352
User since
2008-09-08
4 Artikel
BenutzerIn
[default_avatar]
hi,
soviel ich weiß, kann man das Ergebnis nur als Hashref speichern, also so:

while ( my $cols = $query_handle->fetchrow_hashref) {
...
}

gibt es auch eine Möglichkeit, das Ergebnis (welches bei mir immer nur eine Zeile ist) als Hash zu speichern, also z.B.

$cols{'spaltenname'} = 'spaltenwert';

Bin dankbar für jede Hilfe,

Yato
moritz
 2008-09-08 15:45
#114353 #114353
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Code (perl): (dl )
my %cols = %{ $query_handle->fetchrow_hashref }


Sowas? Wenn es nur eine Ergebniszeile ist, dann mach das einfach nur einmal, kein Grund für eine Schleife.
Yato
 2008-09-08 19:40
#114370 #114370
User since
2008-09-08
4 Artikel
BenutzerIn
[default_avatar]
wow, schnelle Antwort.
so einfach ist das also ...

danke für die Hilfe :-)
Yato
 2008-09-09 18:30
#114427 #114427
User since
2008-09-08
4 Artikel
BenutzerIn
[default_avatar]
hmm,
ich hab jetzt nachträglich noch
use strict;
hinzugefügt, daraufhin kommt ne Fehlermeldung bei diesem Teil :

my %cols =();
%cols = %{ $query_handle->fetchrow_hashref };

und zwar :
>>Can't use an undefined value as a HASH reference at adMover.pl line 297.

gibts ne andere möglichkeit, oder wie umgeht man diesen Fehler?

Yato
Linuxer
 2008-09-09 19:02
#114429 #114429
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

aus perldoc DBI:
Quote
If there are no more rows or if an error occurs, then fetchrow_hashref returns an undef. You should check $sth->err afterwards (or use the RaiseError attribute) to discover if the undef returned was due to an error.


Also sind entweder keine Daten da oder ein Fehler ist aufgetreten... Das zu prüfen obliegt Dir.

Schnellschuss ohne Prüfung:
Du könntest etwas in dieser Art versuchen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
# Warnung verhindern; wenn undef geliefert wird, wird eine Referenz auf
# einen leeren anonymen Hash dereferenziert.
my %cols = %{ $query_handle->fetchrow_hashref || {} };

# Wenn Hash leer, dann gebe Fehlermeldung aus
if ( ! %cols ) {
  print "No data found; Query error: ", $query_handle->err, "\n";
}
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!
Yato
 2008-09-12 01:14
#114558 #114558
User since
2008-09-08
4 Artikel
BenutzerIn
[default_avatar]
funktioniert perfekt, danke ^^
xtomcatx
 2008-09-12 13:22
#114561 #114561
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Ich würde Dir aber empfehlen, Dich mal in das Thema Referenzen einzuarbeiten, dann wirst Du sehen, dass sich damit viel leichter und eleganter umgehen lässt. Wenn Du diesen Hash nur ein einziges Mal brauchst, ist es eigentlich egal. Sobald Du den aber vielleicht noch an ne andere Funktion übergeben willst oder so, bist Du mit Referenzen besser bedient.
Neue Dinge lernt man am leichtesten, wenn die Anwendung noch nicht übermäßig kompliziert ist und man sie eigentlich noch gar nicht unbedingt braucht.
Hier mal das Beispiel von Linuxer ein wenig abgewandelt, in dem ich davon ausgehe, dass Du die Spalte "datum" ausgeben willst.

Code (perl): (dl )
1
2
3
4
5
my $cols = $query_handle->fetchrow_hashref;
if( defined( $cols ) ) {
  print "Datum: $$cols{datum}\n"; }
else {
  die( "No data found; Query error: ", $query_handle->err, "\n" ); }


Solange Du keine komplexen Strukturen erstellen willst, solltest Du mit dem folgenden Grundwissen bzgl. Hashreferenzen auskommen:
Code (perl): (dl )
1
2
3
4
5
6
my %hash = ( key => "value" );   # Erstellen eines Hashs
my $hashRef1 = \%hash;   # Erstellen einer Referenz auf diesen Hash
my $hashRef2 = { key => "value" };  # Erstellen einer Referenz auf einen neuen ("anoynmen") Hash
print $hash{key};     # wie gewohnt
print $$hashRef1{key}, $$hashRef2{key};   # Das $ ist erforderlich, wenn Du einen Wert dereferenzieren willst
print keys( %$hashRef1 ), keys( %{$hashRef2} );  #äquivalente Schreibweisen, dereferenzieren des Hashs.

Die Idee dabei ist, dass Du nicht mit den eigentlichen Hash weitergeben musst, sondern nur die Adresse, wo sich dieser befindet. Zum einen kannst Du so Daten in Subroutinen ändern, ohne sie danach wieder zurückgeben zu müssen. Zum anderen wird dadurch auch Speicher gespart, weil der Hash nicht mehrmals sondern nur einmal existiert. Über kurz oder lang wirst Du um Referenzen nicht rum kommen.
renee
 2008-09-12 13:31
#114562 #114562
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn man sich mit Referenzen beschäftigen möchte, dann ist perlreftut ganz nützlich...
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/
<< >> 8 Einträge, 1 Seite



View all threads created 2008-09-08 15:39.