Schrift
[thread]6717[/thread]

Frage zu Hash::Util

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Crian
 2005-02-17 16:42
#51859 #51859
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Hi,

ich möchte die Hash-Schlüssel einer Substruktur sperren und dachte dafür Hash::Util nehmen zu können.

Jetzt muss ich etwas verwundert feststellen, dass Hash::Util::lock_keys keine Referenz auf ein Hash, sondern das Hash an sich entgegen nimmt.

Wie kann es denn dann etwas an diesem Hash ändern oder begrenzen? Und wie kann ich das auf meinen Fall übertragen?

Meine Struktur ist etwas größer (ein Hash, zu dessen einem Schlüssel ein anderes Hash gehört, dessen Schlüssel ich begrenzen will) und wird von Funktion zu Funktion gereicht.

Any usefull hints?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2005-02-17 17:04
#51860 #51860
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht hilft Dir http://wiki.perl-community.de/bin....raenken weiter...
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/
sri
 2005-02-17 17:08
#51861 #51861
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Habs zwar nicht ganz verstanden, aber zur not duerfte tie wohl helfen.

Ergaenzend sei gesagt das Hash::Util das hash dierekt mit Internals::SvREADONLY veraendert, sollte also so gut wie immer klappen.\n\n

<!--EDIT|sri|1108653393-->
esskar
 2005-02-17 17:15
#51862 #51862
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,17.02.2005, 16:04]Vielleicht hilft Dir http://wiki.perl-community.de/bin....raenken weiter...[/quote]
geht wohl

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use Hash::Util qw(lock_keys);

my %hash = ();

$hash{Erlaubt} = 1;
$hash{Test} = 1;
$hash{Auch_erlaubt} = 1;

lock_keys(%hash);

sub foo {
my $h = shift;
$h->{uhu} = 1;
}

foo(\%hash);

-> "Attempt to access disallowed key 'uhu' in a restricted hash at - line 14."
renee
 2005-02-17 17:23
#51863 #51863
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
auf was bezieht sich Dein "geht wohl"??
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/
renee
 2005-02-17 17:28
#51864 #51864
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Crian: willst Du das hier:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Hash::Util qw(lock_keys);

my %hash = (test => {key => 1, kes => 2},
test2 => {key => 1, kes => 2},
);

lock_keys(%{$hash{test2}});

$hash{test}->{uhu} = 1;
print Dumper(\%hash);

$hash{test2}->{uhu} = 1;
print Dumper(\%hash);


Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
perl lock.pl
$VAR1 = {
'test2' => {
'kes' => 2,
'key' => 1
},
'test' => {
'uhu' => 1,
'kes' => 2,
'key' => 1
}
};
Attempt to access disallowed key 'uhu' in a restricted hash at lock.pl line 17.
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/
esskar
 2005-02-17 17:33
#51865 #51865
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,17.02.2005, 16:23]auf was bezieht sich Dein "geht wohl"??[/quote]
ei das es funktioniert!

und mit ner ref gehts auch
Code: (dl )
1
2
3
4
5
6
7
8
use strict;
use Hash::Util qw(lock_keys);

my $hash = { uhu1 => 1 };
lock_keys(%$hash);
$hash->{uhu2} = 0;
^Z
Attempt to access disallowed key 'uhu2' in a restricted hash at - line 6.
Crian
 2005-02-17 17:52
#51866 #51866
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
ok danke, das hätt ich ja auch kurz testen können. Mir war halt unklar, wie es sein kann, dass

lock_keys(%$hash)

funktioniert. Aber es tut wohl, wie man sieht. Dann bau ich das mal ein :-) Hätte mir eben 1/2 Stunde misteriösen Fehler suchen erspart.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2005-02-17 18:54
#51867 #51867
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Vielleicht hilft es, wenn du einen Blick auf den Prototype wirfst:
Code: (dl )
sub lock_keys (\%;@)
Crian
 2005-02-21 10:50
#51868 #51868
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ja danke, das hilft.

Da ich solche Konstrukte vermeide, weil ich mir schon bei C++ angewöhnt hab, lieber Pointer als Referenzen an Funktionen zu übergeben, weil man dann schon an der Codestelle, an der die Funktion aufgerufen wird, besser sehen kann, was eigentlich Eingabe- und was Ausgabeparameter sind, habe ich nicht daran gedacht, dass es diese Möglichkeit gibt.

Danke für den Augenöffner =)

(Ich will damit gar nicht verallgemeinern, dass man es so machen sollte wie ich es mir angewöhnt habe, nur erklären, warum ich damit nicht gerechnet habe. TIMTOWTDI.)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-02-17 16:42.