Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12144[/thread]

Trick zum vernknüpfen von Hashes

Leser: 1


<< >> 6 Einträge, 1 Seite
Froschpopo
 2008-07-08 10:47
#111929 #111929
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich möchte in einen $self-hash eines Objects mehrere Schlüsselpaare hinzufügen.
Da ich nicht jedesmal $self->{PUBLIC}->{key} = $val schreiben möchte, was relativ häufig vorkommt, möchte ich diese ganzen Paare lieber so hinzufügen wie man sie schreibt, wenn ein hash erstellt wird:
Code (perl): (dl )
1
2
3
my %liste = (
   key => val
)

Das geht aber nicht, weil der Hash in dieser Subroutine schon definiert ist (wird in new() schon definiert).
Da der Hash bis zu 20 KB groß wird will ich aber auch keinen neuen Hash erstellen und diesen dann mit $self->{PUBLIC} verbinden.
Gibt es da eventuell einen Trick?
renee
 2008-07-08 11:54
#111931 #111931
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht hilft Dir das hier weiter
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $hashref = { data => 'test', PUBLIC => { data4 => 'test4' } };

%{ $hashref->{PUBLIC} } = (
  %{ $hashref->{PUBLIC} },
  data2 => 'test2',
  data3 => 'test3',
);

print Dumper $hashref;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2008-07-08 18:13
#111944 #111944
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich würde mir einfach eine Hilfsfunktion definieren:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Update a hash by adding or replacing mappings. Hash references
# stored in the top level hash can be updated recursively, if desired.
# Params:
#   %h      = The hash to modify
#   $depth = Recursion depth.
#   @kv     = New key value pairs.
sub hpush(\%$@);
sub hpush(\%$@) {
    my ($h, $depth, @kv) = @_;
    
    while (@kv) {
        my ($k, $v) = splice @kv, 0, 2;
        
        if ($depth > 0 and ref($h->{$k}) eq 'HASH' and ref($v) eq 'HASH') {
            hpush %{$h->{$k}}, $depth - 1, %{$v};
        }
        else {
            $h->{$k} = $v;
        }
    }
}


Anwendungsbeispiel:
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
use Data::Dumper;

my %h = (
  foo => 42,
  bar => {
    x => {
      u => 1,
      v => 2
    },
    y => 'blubb'
  }
);

print Dumper \%h;

hpush %h, 1, (
  baz => 23,
  bar => {
    x => {
      w => 3
    },
    z => 'blargh'
  }
);


print Dumper \%h;
When C++ is your hammer, every problem looks like your thumb.
pktm
 2008-07-08 19:04
#111947 #111947
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
renees Variante müsste eigetnlich schon ausreichen. Wenn es noch merh sein sollte, kann man sich ja auch mal Hash::Merge ansehen.
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2008-07-08 20:26
#111952 #111952
Da bei renees Variante der komplette Hash kopiert wird, würde ich eher Hash-Slices empfehlen:
Code: (dl )
@hash{ @keys } = @values;

Beispiel, %add_hash wird %hash hinzugefügt:
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

$Data::Dumper::Sortkeys = 1;

my %hash = (
-a => 1,
-b => 2,
-c => 3,
);

print Dumper( \%hash ), "\n\n";

my %add_hash = (
-d => 4,
-e => 5,
-f => 6,
);

my @keys_add_hash = keys %add_hash;

@hash{ @keys_add_hash } = @add_hash{ @keys_add_hash };

print Dumper( \%hash );

MfG
pktm
 2008-07-08 21:11
#111956 #111956
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
perlfaq4 hat dazu noch schöne Informationen und Schnipsel.
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 6 Einträge, 1 Seite



View all threads created 2008-07-08 10:47.