From f4e53d90c9bf2c9d26e8155b5f9221cdb8fcb9a7 Mon Sep 17 00:00:00 2001 From: Christian Walde Date: Fri, 9 Nov 2012 14:48:35 +0100 Subject: golfed the remove_symbol function --- lib/Package/Stash/PP.pm | 62 ++++++++++++++----------------------------------- 1 file changed, 17 insertions(+), 45 deletions(-) diff --git a/lib/Package/Stash/PP.pm b/lib/Package/Stash/PP.pm index 71ee4e5..b8f3ed9 100644 --- a/lib/Package/Stash/PP.pm +++ b/lib/Package/Stash/PP.pm @@ -330,56 +330,28 @@ sub remove_symbol { # no doubt this is grossly inefficient and # could be done much easier and faster in XS - my ($scalar_desc, $array_desc, $hash_desc, $code_desc, $io_desc) = ( - { sigil => '$', type => 'SCALAR', name => $name }, - { sigil => '@', type => 'ARRAY', name => $name }, - { sigil => '%', type => 'HASH', name => $name }, - { sigil => '&', type => 'CODE', name => $name }, - { sigil => '', type => 'IO', name => $name }, + my %desc = ( + SCALAR => { sigil => '$', type => 'SCALAR', name => $name }, + ARRAY => { sigil => '@', type => 'ARRAY', name => $name }, + HASH => { sigil => '%', type => 'HASH', name => $name }, + CODE => { sigil => '&', type => 'CODE', name => $name }, + IO => { sigil => '', type => 'IO', name => $name }, ); + confess "This should never ever ever happen" if !$desc{$type}; - my ($scalar, $array, $hash, $code, $io); - if ($type eq 'SCALAR') { - $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc); - $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc); - $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc); - $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc); - } - elsif ($type eq 'ARRAY') { - $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION; - $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc); - $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc); - $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc); - } - elsif ($type eq 'HASH') { - $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION; - $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc); - $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc); - $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc); - } - elsif ($type eq 'CODE') { - $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION; - $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc); - $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc); - $io = $self->get_symbol($io_desc) if $self->has_symbol($io_desc); - } - elsif ($type eq 'IO') { - $scalar = $self->get_symbol($scalar_desc) if $self->has_symbol($scalar_desc) || BROKEN_SCALAR_INITIALIZATION; - $array = $self->get_symbol($array_desc) if $self->has_symbol($array_desc); - $hash = $self->get_symbol($hash_desc) if $self->has_symbol($hash_desc); - $code = $self->get_symbol($code_desc) if $self->has_symbol($code_desc); - } - else { - confess "This should never ever ever happen"; - } + my @types_to_store = grep { $type ne $_ && $self->has_symbol($desc{$_}) } + keys %desc; + my %values = map { $_, $self->get_symbol($desc{$_}) } @types_to_store; + + $values{SCALAR} = $self->get_symbol($desc{SCALAR}) + if !defined $values{SCALAR} + && $type ne 'SCALAR' + && BROKEN_SCALAR_INITIALIZATION; $self->remove_glob($name); - $self->add_symbol($scalar_desc => $scalar) if defined $scalar; - $self->add_symbol($array_desc => $array) if defined $array; - $self->add_symbol($hash_desc => $hash) if defined $hash; - $self->add_symbol($code_desc => $code) if defined $code; - $self->add_symbol($io_desc => $io) if defined $io; + $self->add_symbol($desc{$_} => $values{$_}) + for grep { defined $values{$_} } keys %values; } sub list_all_symbols { -- cgit v1.2.3-54-g00ecf