Schrift
[thread]7487[/thread]

Ties und Hashrefs

Leser: 1


<< >> 10 Einträge, 1 Seite
J-jayz-Z
 2005-11-21 21:34
#60295 #60295
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi, ich hab hier ein Problem, wie das mit Ties und Hashreferenzen ist.
Ich will (nur als beispiel) das beliebte "Groß und Kleinschreibungshash" in allen anonymen Hashes übernehmen.
Also das:
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
37
38
#!/usr/bin/perl
use strict;
use warnings;

package main;

my %foo;
tie %foo, "myTieHash";

$foo{BluBb} = "foo";
$foo{grML} = "bar";

print $foo{BlUbb} . "\n";
print $foo{grml} . "\n";

package myTieHash;

#Konstruktor für ein Hash Tie
sub TIEHASH {
my $class = shift;
my %self = @_;
return bless \%self, $class;
}

#Routine für den Schreibzugriff
sub STORE {
my $self = shift;
my ($key, $value) = @_;
return $self->{ucfirst lc $key} = $value;
}

#Routine für den Lesezugriff
sub FETCH {
my ($self, $key) = @_;
return $self->{ucfirst lc $key};
}

1;

mit beliebig vielen anonymen Hashes.
Also $foo->{bar}->{bLa}->{blubb}.
Kann mir da wer helfen ?

P.S.:perldoc perltie hat mir auch nich geholfen ...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pq
 2005-11-21 22:20
#60296 #60296
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
da gibt es aber auch schon ein modul für. allerdings nur auf einer ebene.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
J-jayz-Z
 2005-11-21 22:23
#60297 #60297
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was meinst du?
Tie::TieHash ?
Das hilft mir aber auch nicht. Ich sag mal so, unendlich muss nicht sein, aber so um die 8 keys können es schon gut sein ...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pq
 2005-11-21 22:50
#60298 #60298
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
nein, ein modul, das unabhängig von groß- und kleinschreibung speichert.

CPAN:Hash::Case\n\n

<!--EDIT|pq|1132606327-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
J-jayz-Z
 2005-11-21 22:53
#60299 #60299
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das macht mein Script oben doch auch schon :)
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pq
 2005-11-21 23:35
#60300 #60300
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=J-jayz-Z,21.11.2005, 21:53]Das macht mein Script oben doch auch schon :)[/quote]
nein, das CPAN-modul war vorher da, das ist der unterschied.
aber tie() funktioniert nur auf der ersten ebene. wenn du einen hashuzugriff
kontrollieren willst, muss genau dieser hash ein tied hash sein.
bei dir ist es aber ein anonymer hash. du müsstest alle rekursiv tie()n,
und ich denke, das ist keine arbeit, die man sich machen will.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
J-jayz-Z
 2005-11-21 23:42
#60301 #60301
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Na ja, mir wird nichts anderes übrig bleiben ...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
ptk
 2005-11-21 23:45
#60302 #60302
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=pq,21.11.2005, 21:50]nein, ein modul, das unabhängig von groß- und kleinschreibung speichert.

CPAN:Hash::Case[/quote]
Oder auch CPAN:Tie::CPHash (uralt)
J-jayz-Z
 2005-11-22 01:11
#60303 #60303
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habe es nun versucht rekursiv alles zu tien, bekomm aber speziell das tie nicht hin.
Das rekursive Durchlaufen ist okay, das geht auch soweit. Nur wenn ich das aktuelle Element tie ist das nächste nicht mehr in der Ausgabe ...
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
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl
use strict;
use warnings;

package main;

my $foo = { bla => { foo => { bar => "a"} } };

check($foo);

sub check {
my $bla = shift;
my @key;
if(ref($bla) eq 'HASH') {
@key = keys %{ $bla };
print "<<$key[0]>>\n";
# tie %{ $bla }, "myTieHash";
$bla = $bla->{$key[0]};
check($bla);
}
}

package myTieHash;

#Konstruktor für ein Hash Tie
sub TIEHASH {
my $class = shift;
my $self = { @_ };
return bless $self, $class;
}

#Routine für den Schreibzugriff
sub STORE {
my $self = shift;
my ($key, $value) = @_;
return $self->{ucfirst lc $key} = $value;
}

#Routine für den Lesezugriff
sub FETCH {
my ($self, $key) = @_;
return $self->{ucfirst lc $key};
}

1;

Wenn man das tie() wieder rein nimmt, sieht man mein Problem ...
Jemand ne Idee ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
ptk
 2005-11-22 01:55
#60304 #60304
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du kannst keinen bestehenden Hash tie'en, sondern musst immer eine Kopie nach dem tie machen.

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use Tie::CPHash;

$foo = rectie({ bla => { foo => { bar => "a"} } });
warn $foo->{BLA}->{FOO}->{BAR};

sub rectie {
my($hashref) = @_;
while(my($k,$v) = each %$hashref) {
if (UNIVERSAL::isa($v, "HASH")) {
my $new_v = rectie($v);
$hashref->{$k} = $new_v;
}
}
tie my %newhash, "Tie::CPHash";
%newhash = %$hashref;
\%newhash;
}
<< >> 10 Einträge, 1 Seite



View all threads created 2005-11-21 21:34.