Thread Geht das auch kürzer? Und die Performance?: push @array, Win32::ODBC::Datahash (7 answers)
Opened by pktm at 2005-02-03 19:14

Dubu
 2005-02-03 21:20
#51545 #51545
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@pktm: Vergleiche die folgenden Codes:
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
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @array;
my $inhalt;        # Variable VOR der Schleife deklariert
for (0 .. 9) {
   $inhalt = $_;
   push @array, \$inhalt;
}
print Dumper \@array;
_ _END_ _
$VAR1 = [
         \9,
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0],
         $VAR1->[0]
       ];

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
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @array;
for (0 .. 9) {
   my $inhalt = $_;        # Variable IN der Schleife deklariert
   $inhalt = $_;
   push @array, \$inhalt;
}
print Dumper \@array;
_ _END_ _
$VAR1 = [
         \0,
         \1,
         \2,
         \3,
         \4,
         \5,
         \6,
         \7,
         \8,
         \9
       ];

Du siehst: Wenn du die Variable vor der Schleife deklarierst, wird immer die gleiche Referenz im Array gespeichert, und damit immer der gleiche Wert!
Wenn die Variable in der Schleife deklarierst, gibt es bei jedem Durchlauf eine neue Referenz, und das ist meist das Gewuenschte.

Ein extra Variable brauchst du aber gar nicht, denn hier kannst du ja mit einem anonymen Hash arbeiten:
Code: (dl )
1
2
3
while( $db->FetchRow() ){
   push @daten, { $db->DataHash() };
}

Wenn du unbedingt moechtest, kannst du das auch mit while als Statement-Modifier in eine Zeile schreiben, wovon es aber auch nicht viel uebersichtlicher wird:
Code: (dl )
push @daten, { $db->DataHash() } while $db->FetchRow;



@esskar: Das kann doch so nicht funktionieren. FetchRow() liefert kein Array, sondern nur wahr oder falshc fuer jeden Aufruf. Und es wird dann jeweils $db->FetchRow() aufgerufen.

View full thread Geht das auch kürzer? Und die Performance?: push @array, Win32::ODBC::Datahash