1
2
3
4
5
6
7
8
9
10
11
12
$daten{name} = Test
$daten{Test}{adr_ip} = 192.168.10.10
$daten{Test}{reserve} = "---"
#jetzt möchte ich die Adresse des hash an eine Funktion übergeben
sub bereitstellen_hash
{
my ($na) = @_;
return \$daten{$na);
}
my $myref =bereitstellen_hash(Test);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#! /usr/bin/perl use strict; use warnings; use 5.020; my %data; $data{foo}{addr} = "1.2.3.4"; $data{foo}{name} = "foofoo"; $data{bar}{addr} = "9.8.7.6"; $data{bar}{name} = "barbar"; sub get_reference { my $key = shift; return $data{$key}; } my $myref = get_reference( "foo" ); say $myref->{name}, "\n", $myref->{addr}; __END__
my $var_ref = lesen_var_referenz('SYS_verz_meldung_max_differenz_rrm');
print $var_ref->{mpi};
1
2
3
my $var_ref = lesen_var_referenz('SYS_verz_meldung_max_differenz_rrm');
print $var_ref."\n";
print $var_ref->{mpi};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub lesen_var_referenz
{
my ($keys) = @_;
my $socket;
my $empf;
$socket = new IO::Socket::INET (
PeerAddr => $database_data::hostname,
PeerPort => $database_data::port,
Type => SOCK_STREAM,
Proto => 'tcp'
); die schreibeLogeintrag("Unable to setup socket: $! im Script '$0'\n") unless defined $socket;
$socket->send("lesen_var_referenz $keys");
$socket->recv($empf,8196);
return $empf;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub lesen_var_referenz
{
my ($newsock,$variablenname) = @_;
if (exists $daten{$variablenname})
{
# $daten->name
# $daten->name->mpi
# $daten->name->wert
# $daten->name->typ
# $daten->name->db
# $daten->name->byte
# $daten->name->bit
# $daten->name->format
$newsock->send($daten{$variablenname});
}
else
{ &schreibeLogeintrag("Schluessel:".$variablenname." wurde im Script $0 in der Funktion: \"lesen_var_referenz\" nicht gefunden\n");}
}
Quoteist ein bischen zu wenig für eine Fehlerbeschreibung. Tipp: Nimm mal den Data::Dumper der zeigt Dir Deine Datenstrukturen.das geht nicht.
2019-02-03T14:51:01 rostiQuote
Und noch etwas: Ein Socket ist ein Handle. D.h., in ein Handle gibt man keine Referenzen sondern Bytesequenzen und beim Lesen ist das umgekehrt. Zwischen Datenstrukturen und Bytesequenzen vermittelt ein Serializer.
.
.. so war es schon immer (Bestand), ich kann das nicht ändern, da sonst andere Programme nicht mehr darauf zugreifen können.
1
2
3
4
my $var_ref = lesen_var_referenz('SYS_verz_meldung_max_differenz_rrm');
print Dumper($var_ref);
my $bar;
print Data::Dumper->Dump([$var_ref, $bar], [qw(var_ref *ary)]);
1
2
3
4
Ausgabe:
$VAR1 = 'HASH(0x55d754e8f098)';
$var_ref = 'HASH(0x55d754e8f098)';
$ary = undef;
1
2
3
4
5
6
sub lesen_var_referenz
{ my ($newsock, $variablenname) = @_;
$newsock->send($daten{$variablenname}{format});
}
my $var_ref = lesen_var_referenz('SYS_verz_meldung_max_differenz_rrm');
print $var_ref;
1
2
3
4
5
6
7
sub lesen_var_referenz
{ my ($newsock, $variablenname) = @_;
$newsock->send($daten{$variablenname});
}
my $var_ref = lesen_var_referenz('SYS_verz_meldung_max_differenz_rrm');
print $var_ref->{format}; # Zeile 171
$VAR1 = 'HASH(0x55d754e8f098)';
1 2 3 4 5 6 7
my %h = ( foo => 'bar', dog => 'boo' ); print Dumper \%h; $VAR1 = { 'dog' => 'boo', 'foo' => 'bar' };
$VAR1 = 'HASH(0x55d754e8f098)';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub lesen_var_referenz {
my ($keys) = @_;
my $empf;
my $socket = new IO::Socket::INET (
PeerAddr => $database_data::hostname,
PeerPort => $database_data::port,
Type => SOCK_STREAM,
Proto => 'tcp'
);
die schreibeLogeintrag("Unable to setup socket: $! im Script '$0'\n")
unless defined $socket;
$socket->send("lesen_var_referenz $keys");
$socket->recv($empf,8196);
return $empf;
}
my $data = fetch_from_socket( 'SYS_verz_meldung_max_differenz_rrm', 'mpi' );