Schrift
[thread]8783[/thread]

exists() legt Hashkeys an

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
bloonix
 2007-02-22 20:24
#74517 #74517
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

heute bin ich auf etwas sehr unangenehmes gestoßen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
use strict;
use warnings;
use Data::Dumper;

my %hash;

print "key foo->bar exists\n"
if exists $hash{foo}{bar};

print Dumper(\%hash);


$VAR1 = {
'foo' => {}
};


Kann ich das irgendwie umgehen? Der Key 'foo' wird einfach angelegt.

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
esskar
 2007-02-22 20:26
#74518 #74518
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
falscher fehler

Code: (dl )
1
2
3
4
my %hash;

print "key foo->bar exists\n"
if(exists($hash{foo}) and exists($hash{foo}{bar}));
nepos
 2007-02-22 22:47
#74519 #74519
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Autovivification war glaube ich das Stichwort dazu...
renee
 2007-02-23 09:52
#74520 #74520
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das passiert nur wenn Du das was Du überprüfst nicht in der 1. Ebene ist. Du kannst das also nur umgehen, indem Du die Hashreferenz der zu überprüfenden Ebene in einem Skalar speicherst und darauf überprüfst...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
use Data::Dumper;

my %hash;
my $tmp;

print "key foo->bar exists\n"
if $tmp = $hash{foo} and exists $tmp->{bar};

print Dumper(\%hash);
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/
.mike.
 2007-02-23 21:59
#74521 #74521
User since
2006-04-07
26 Artikel
BenutzerIn
[default_avatar]
weiß zufällig einer ob es diese autovivification auch noch bei Perl 6 geben wird ?
betterworld
 2007-02-24 04:44
#74522 #74522
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=renee,23.02.2007, 08:52]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
use Data::Dumper;

my %hash;
my $tmp;

print "key foo->bar exists\n"
 if $tmp = $hash{foo} and exists $tmp->{bar};

print Dumper(\%hash);
[/quote]
Mit der temporaeren Variable wird dafuer gesorgt, dass der Schluessel "foo" nur ein einziges Mal in dem Hash gesucht wird.  Trotzdem bevorzuge ich die Schreibweise von esskar, weil sie klarer ist, wenn auch moeglicherweise ineffizienter.\n\n

<!--EDIT|betterworld|1172285092-->
bloonix
 2007-02-24 13:44
#74523 #74523
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Just for fun :)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use Benchmark;

my @keys = qw(a b c d e f g h i j);

sub _exists {
my %keys;
exists $keys{$_}{1}
for @keys;
}

sub _keyref {
my %keys;
$keys{$_} = {}
for @keys;
}

Benchmark::cmpthese(-1, {
'exists' => \&_exists,
'key=ref' => \&_keyref,
});


          Rate key=ref  exists
key=ref 80388/s      --    -10%
exists  89321/s     11%      --

          Rate key=ref  exists
key=ref 80388/s      --    -10%
exists  89647/s     12%      --

          Rate key=ref  exists
key=ref 79644/s      --    -11%
exists  89647/s     13%      --
\n\n

<!--EDIT|opi|1172317868-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
esskar
 2007-02-24 18:12
#74524 #74524
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm, warum erzeugt renees code keinen schlüssel?
pq
 2007-02-24 18:31
#74525 #74525
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=esskar,24.02.2007, 17:12]hmm, warum erzeugt renees code keinen schlüssel?[/quote]
weil das exists gar nicht aufgerufen wird.
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
betterworld
 2007-02-24 18:33
#74526 #74526
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=esskar,24.02.2007, 17:12]hmm, warum erzeugt renees code keinen schlüssel?[/quote]
Naja, wenn der Schluessel noch nicht existiert, ist $tmp halt undef.  Es macht eigentlich genau dasselbe wie Dein Code, nur dass es nicht zweimal $hash{foo} aufloest.

Uebrigens sollte man bedenken, dass $hash{foo}{bar} eine Exception gibt, wenn $hash{foo} existiert, aber kein Hash (bzw Hashreferenz) ist.  Aber meist handelt es sich dabei auch tatsaechlich um einen Fehler.

[s]opi: Ist doch klar, bei der Autovivification wird nur beim ersten Schleifendurchlauf der Hash angelegt.  Daher ist es schneller.[/s]\n\n

<!--EDIT|betterworld|1172341991-->
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-02-22 20:24.