Schrift
[thread]11291[/thread]

Rückgabe mehrerer Hashes geht nicht

Leser: 1


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
SchaubFD
 2008-02-13 09:24
#105827 #105827
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein einfaches Problem, bekomme aber keine Lösung.

Ich generiere in einer Funktion mehrere Hashes %A, %B, %C und einen Zähler $Z.

Wenn ich nun diese Hashes Werte zuweise, dann sind diese innerhalb der Funktion noch auslesbar. Gebe ich diese über einen Return weiter, so bekomme ich keinen Inhalt bei den Hashes. Der Zähler enthält aber den richtigen Wert.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub fu() {
$A{1}="Hugo";
$B{1}="Schmitt";
$C{1}="Vorsitzender";
$Count=1;
return (\%A,\%B,\%C,$Count);
};

($rA,$rB,$rC,$Anzahl)=fu;

print "$rA{1} $rB{1} $rC{1}\n";


Auch folgende Schreibweise ändert nichts daran.
Code: (dl )
print "$rA->{1} $rB->{1} $rC->{1}\n";


Bin bei Perl noch Anfänger, komme aber mit AWK alleine nicht weiter.
styx-cc
 2008-02-13 11:15
#105828 #105828
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl -w
use strict;

my ($rA,$rB,$rC,$Anzahl)=fu();
print "$rA->{1} $rB->{1} $rC->{1}\n";

sub fu {
my $A{1}="Hugo";
my $B{1}="Schmitt";
my $C{1}="Vorsitzender";
my $Count=1;
return (\%A,\%B,\%C,$Count);
}


Versuchs mal so
Pörl.
SchaubFD
 2008-02-13 11:42
#105829 #105829
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Hallo,

erstmal Danke für deine Antwort, ich bin einen kleinen Schritt weiter, blicke aber bei der Ausgabe noch nicht so recht durch. Mein Code zum Testen sieht derzeit so aus:

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
use strict;
use warnings;

sub pause {
print '[Return] um fortzufahren ...'; <>;
}

sub fu() {
my %A;
my %B;
my %C;
my $Count;

$Count=0;
$A{$Count}="Hugo";
$B{$Count}="Schmitt";
$C{$Count}="Vorsitzender";
$Count++;
$A{$Count}="Dieter";
$B{$Count}="Klein";
$C{$Count}="Personalrat";
$Count++;

return (\%A,\%B,\%C,$Count);
};

my %rA;
my %rB;
my %rC;
my $Anzahl;

(%rA,%rB,%rC,$Anzahl)=fu;

# Ausgabe fehlt noch bzw. funktioniert nicht.

pause;


Ich hoffe das ich in der Übergabe keine Fehler habe. Ich stehe mit Perl und den Hashes noch etwas auf Kriegsfuß wie man hier sagt.
Taulmarill
 2008-02-13 12:28
#105831 #105831
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Der Fehler liegt darin, dass %rA ein Hash ist. Da du aber eine Referenz auf einen Hash zurück gibst, willst du wahrscheinlich eher $rA benutzen. Dann kannst du mit $rA->{0} usw. auf die Werte im Hash zugreifen.

Btw. wenn du einen rein numerischen Index benutzt, eignet sich ein Array wahrscheinlich besser als ein Hash.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Struppi
 2008-02-13 12:28
#105832 #105832
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Naja, du stehst eher auf Kriegsfuß mit Referenzen. Die Rückgabewerte sind Referenzen auf Hashes, du musst das Beispiel genauso wie es styx geschrieben hat auch verwenden.

Und evtl. hilft dir auch ein wenig Lektüre:
http://perldoc.perl.org/perlref.html
SchaubFD
 2008-02-13 12:52
#105833 #105833
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Besteht denn die Möglichkeit, mein Skript wenigstens als Beispiel mal funktionsfähig zu ändern? Ich möchte nur auf den Hash zugreifen.

Ich möchte in der Funktion einen Hash generieren (auch wenn eine Liste ebenso möglich wäre, brauche das aber in weiteren funktionen nicht als Liste). Dieser Hash in der Funktion soll an einen Hash zugewiesen werden. Ob das via Referenz oder nicht ist, ist mir erstmal egal.

Code: (dl )
1
2
3
4
5
6
7
8
9
C:\>perl test2.pl
syntax error at test2.pl line 8, near "$A{"
syntax error at test2.pl line 9, near "$B{"
syntax error at test2.pl line 10, near "$C{"
Global symbol "%A" requires explicit package name at test2.pl line 12.
syntax error at test2.pl line 13, near "}"
Execution of test2.pl aborted due to compilation errors.

C:\>


Das ist übrigens die Ausgabe des Perlinterpreters auf diesen Code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl -w
use strict;

my ($rA,$rB,$rC,$Anzahl)=fu();
print "$rA->{1} $rB->{1} $rC->{1}\n";

sub fu {
my $A{1}="Hugo";
my $B{1}="Schmitt";
my $C{1}="Vorsitzender";
my $Count=1;
return (\%A,\%B,\%C,$Count);
}
Taulmarill
 2008-02-13 13:45
#105835 #105835
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
so sollte es gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;

my ($rA,$rB,$rC,$Anzahl)=fu();
print "$rA->{1} $rB->{1} $rC->{1}\n";

sub fu {
my ( %A, %B, %C );
$A{1} = "Hugo";
$B{1} = "Schmitt";
$C{1} = "Vorsitzender";
my $Count = 1;
return (\%A,\%B,\%C,$Count);
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
SchaubFD
 2008-02-13 14:40
#105836 #105836
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Danke!

Das ist dann aber eine Lösung die nur über Referenzen läuft, nicht über einen Hash oder ? Ich frage mich immer noch, warum muss man diese unterschiedlichen Typen nutzen, um auf einen Hash zugreifen zu können?

Frei nach dem Schema (nicht ganz auf syntax achten)

# Alles $A
my $A;
$A=1;
return $A;
print $A;

Das ist das was mich nervt!

my %A; # Hier mit %
$A{1}="Wert"; # Hier mit $
return \%A; # Hier mit \% ... ok mittlerweile verstanden
print $A->{1}; # Hier mit ->

Auch wenn meine Fragen nervig sind, sind Übergaben von Hashes nur über Referenzen möglich?
nepos
 2008-02-13 14:49
#105837 #105837
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der Grund, warum an dieser Stelle Referenzen gebraucht werden ist, da du ohne diese nicht die 3 Hashes zurückgeben kannst. Probiers einfach mal aus ;)
#Kein Kommentar
 2008-02-13 17:28
#105849 #105849
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
wenn du das hier schreiben würdest:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub funktion{
    my ( %A, %B, %C );
    $A{1} = "Hugo";
    $B{1} = "Schmitt";
    $C{1} = "Vorsitzender";

    return (%A, %B, %C);
}

my (%a, %b, %c) = funktion ();



dann würde das hash %a alle hashs einverleibt kriegen, die die sub 'funktion' zurück gibt, während jedoch %b und %c leer bleiben...
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2008-02-13 09:24.