Schrift
[thread]12029[/thread]

Kann Hash nicht übergeben



<< >> 6 Einträge, 1 Seite
roooot
 2008-06-16 23:27
#111103 #111103
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Hallo, mal wieder:

Ich würde gerne folgendes übergeben. Mit der Arrayref klappt alles nur der Hash irgendwie nicht. Ich weiß auch nicht wie

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub foo  {

    #........

    my %sql_info = {
        rows => $query->rows(),
    };

    return (\@sql_output, \%sql_info);
}


es soll dann so empfangen werden:
Code (perl): (dl )
1
2
3
4
5
sub bar {
     my (@sql_output, %sql_info) = foo();

     return  (\@sql_output, \%sql_info);
}


Code (perl): (dl )
1
2
3
my ($sql_output_ref,$sql_info_ref) = bar();
my @sql_output = @{ $sql_output_ref };
my %sql_info = %{ $sql_info_ref }


Am Schluss ist es wichtig, dass ich einen echten Hash habe, nicht nur eine Referenz. Aber so wie ich es habe gehts leider nicht :(
Ich bin grad etwas am verzweifeln.
Viele Grüße :)
Linuxer
 2008-06-16 23:51
#111108 #111108
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

wenn Du Referenzen zurückgibst, musst Du sie auch als solche aufnehmen.

Perl wandelt nicht automatisch eine zurückgegebene Referenz in den entsprechenden Typ zurück. Diese Aufgabe musst Du als Programmierer bewältigen und programmieren.

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
sub bar {
  my ( $array_ref, $hash_ref ) = foo();

  # arbeite mit Kopien der Werte aus den dereferenzierten Referenzen
  my @sql_output = @$array_ref;
  my %sql_info   = %$hash_ref;
  return \@sql_output, \%sql_info;
}

## oder

sub bar {
  my ( $array_ref, $hash_ref ) = foo();

  # arbeite mit den Referenzen

  for ( @$array_ref ) { # oder @{ $array_ref } 
    printf "SQL OUTPUT: %s\n", $_;
  }

  for ( keys %$hash_ref ) { # oder %{ $hash_ref }
    printf "SQL INFO: %s => %s\n", $_, $hash_ref->{$_};
  }
}
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!
roooot
 2008-06-17 00:18
#111109 #111109
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Das ist komisch. Denn wenn ich den in bar die array_ref empfange, verliert der Array alle Werte außer den 1, nachdem ich ihn wieder in einen Array umgewandelt habe (Zieile 5 bei dir).
Empfange ich hingegen den Array direkt (nachdem ich aber komischerweise eine Referenz \@array) übergeben habe, bleiben alle Werte erhalten.

Gebe ich dann noch das %sql_info weiter über ein return wie in Zeile 7 bei dir, dann wird das %sql_info einfach an den Array drangehängt, sprich ein croak von @sql_output (direkt empfangen*) ergibt einfach ARRAYHASH und nicht nur ARRAY. %sql_info, was empfangen werden soll ist hingegen einfahc nur leer.

Ich versteh das nicht




*
Code (perl): (dl )
1
2
3
4
5
# bar:
my (@sql_output, %sql_info) = foo();

#foo:
return (\@sql_output, \%sql_info);
Viele Grüße :)
Linuxer
 2008-06-17 00:34
#111110 #111110
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Der Code ist fehlerhaft in seiner Logik.

Code: (dl )
1
2
3
4
5
# bar:
my (@sql_output, %sql_info) = foo();

#foo:
return (\@sql_output, \%sql_info);


foo() liefert 2 Werte zurück, nämlich 2 Referenzen; die erste auf einen Array, die zweite auf einen Hash.

innerhalb von bar() nimmst Du diese beiden Referenzen entgegen und packst *BEIDE* in einen Array @sql_output; der Hash %sql_info bekommt nix ab.
Wo bitte dereferenzierst Du die Referenzen?

"croak @sql_output" gibt das richtige aus, denn
$sql_output[0] = ARRAY-ref
$sql_output[1] = HASH-ref

...

Wenn man es richtig macht, geht nix verloren:

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
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;


sub foo {

    my @array = ( 1, 2 );
    my %hash  = ( a => 'A', b => 'B' );

    return \@array, \%hash;
}


sub bar {

    # Skalare weil 2 Referenzen geliefert werden; KEIN ARRAY+HASH
    my ( $aref, $href ) = foo();

    print "Ref: $aref - $href\n";

    for ( @$aref ) {
        print "Array: $_\n";
    }
    for ( keys %$href ) {
        print "Hash: $_ => $href->{$_}\n";
    }
}

bar();


update: Grammatikfehler ausgebessert.
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!
roooot
 2008-06-17 00:43
#111111 #111111
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Danke für deine Aufschlüsselung ich werde es mal entsprechend umbauen
Viele Grüße :)
roooot
 2008-06-17 00:53
#111112 #111112
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Danke es funktioniert, habe gerade auch bemerkt, dass JSON (das ich gerade zum 1. mal verwende) Referenzen benötigt. Das hab ich natürlich verschwitzt und mich immer gewundert, also habe ich gedacht ich übergebe irgendwas falsch.

Vielen Dank für deine Mühe!!
Viele Grüße :)
<< >> 6 Einträge, 1 Seite



View all threads created 2008-06-16 23:27.