Probleme bei Rückgabe von Hashes

S

SchaubFD

Mitglied
Hallo,

ich habe folgendes Problem, ich möchte mehrere Hashes gleichzeitig über ein "return" zurückgeben, leider ist die Rückgabe ewig leer oder Null.

Code:
return (
   \%pos_rechnungsbereich,\%pos_produktfamilie,\%pos_anbieter,
   \%pos_vertragsnummer,\%pos_account,\%pos_anschlussart,
   \%pos_anschluss,\%pos_infoanschlussart,\%pos_infoanschluss,
   \%pos_verbindungen,\%pos_leistungen,\%pos_leistungart,
   \%pos_menge,\%pos_nettoeinzel,\%pos_nettogesamt,\%pos_steuer,
   $pos_count
 );

In folgendem Code werden die Hashes übergeben und der Zähler, Wobei der Zähler OK ist.

Code:
(
 $pos_rechnungsbereich,$pos_produktfamilie,$pos_anbieter,
 $pos_vertragsnummer,$pos_account,$pos_anschlussart,
 $pos_anschluss,$pos_infoanschlussart,$pos_infoanschluss,
 $pos_verbindungen,$pos_leistungen,$pos_leistungart,
 $pos_menge,$pos_nettoeinzel,$pos_nettogesamt,$pos_steuer,
 $pos_count
)=lese_pos();

Was mache ich bei der Übergabe falsch? Alle Hashes sind in der Funktion gefüllt, aber nach der Übergabe leer.
 
Hallo
Wie stellst du fest, dass die leer sind?
Wie greifst du darauf zu?

Kleines Beispiel:
Code:
perl -e '
sub fu(){$A{1}=b;
$B{A}=5;
return \%A,\%B;};
($rA,$rB)=fu;
print "$rA->{1} $rB->{A}\n"
'

Zeig mal ein Beispiel, wie du sie in der Funktion definierst, füllst und wie du den Returnwert auswertest.

Tipp:
ref gibt dir den Typ zurück.
Gruß Wolfgang
 
Code:
$pos_nettogesamt{pos_count}     =$nettogesamt;

Das ist die Zuweisung in der Funktion. Ist bei allen Feldern ähnlich. Dort bekomme ich mit "print $pos_nettogesamt{pos_count}" nach der Zuweisung auch einen Wert zurück.

Nur nach dem Funktionaufruf geht es nicht (also das Übertragen des Hashes aus der Funktion heraus bzw. diese Adressübergabe.
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Code:
sub fu() {
  $A{1}=b;
  $B{A}=5;
  return (\%A,\%B);
};

($rA,$rB)=fu;

print "$rA{1} $rB{A}\n"

So müsste das in meiner Art aussehen.
 
Zuletzt bearbeitet:
Dann sollte bei dir folgendes einen Wert zeigen:
Code:
print "$pos_nettogesamt->{pos_count}\n";
 
Wolfgang, ich kann das erst morgen früh probieren. Wie schon gesagt, mit meiner Variante geht es nicht. Ich bekomme keine Fehlermeldungen. Danke für deinen Vorschlag.

Leider geht es immer noch nicht! Der count ist ein einfacher ganzzahliger Zähler, den ich später noch für Sortierungen brauche. Ich möchte nur mit $A->{1} oder $A->{99} auf den Hash-Inhalt zugreifen. Mache ich was in der Übergabe also dem Funktionsaufruf falsch? Ich weis nicht weiter.

Hier mal ein komplettes Beispiel
Code:
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}><$Anzahl>\n"

Das Ergebnis sollte
<Hugo><Schmitt><Vorsitzender><1>
sein!
Perl macht daraus
<><><><1>
 
Zuletzt bearbeitet:
Hallo,

mittlerweile habe ich eine Lösung über Referenzen, möchte diese Hilfestellung aus einem Perl Forum gerne zeigen:

Code:
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 $hA;
my $hB;
my $hC;
my $Anzahl;

($hA,$hB,$hC,$Anzahl)=fu;

print "<$hA->{0}><$hB->{0}><$hC->{0}>\n";
print "<$hA->{1}><$hB->{1}><$hC->{1}>\n";

pause;
 
Sorry, habe dein edit nicht mehr gelesen.
Aber da du wohl vorher nicht use strict benutzt hast, hast du die ref nicht angezeigt bekommen, wo du Werte erwartet hast.
Genau das hatte ich ja vermutet.
Wie du auf ref-hash-werte zugreifst hatte ich ja gezeigt.
print "$pos_nettogesamt->{pos_count}\n";

Wenn du unsicher bist, dreferenziere vorher.
Code:
my %newhash=%$refHash;

Gruß Wolfgang
 

Ähnliche Themen

sed - Bitte um Unterstützung

Keine grafische Oberfläche (Debian Installation)

Rückgabe eines Befehls

Keine Zugriff von Windows 10 auf Sambafreigaben

SED und TCPDUMP

Zurück
Oben