On Sep 21, Errin Larsen said: >On Tue, 21 Sep 2004 14:58:43 -0400 (EDT), Jeff 'japhy' Pinyan ><[EMAIL PROTECTED]> wrote: >> On Sep 21, Bob Showalter said: >> >> > my %hash = ( >> > foo => 1, >> > bar => 2, >> > baz => 3, >> > qux => 4, >> > ); >> > >> >I would like to remove all the entries in the hash except for 'bar' and >> >'qux'. (Actual hash has other entries which can vary at runtime. I know that >> >I only want to keep 'bar' and 'qux' however). >> >> > my @keys = qw(bar qux); >> >> my %keep_these_keys; >> @keep_these_keys{qw( bar qux )} = (); >> >> delete @hash{ grep !exists $keep_these_keys{$_}, keys %hash }; > >So ... is there a way to return a 'not' slice of hashes? What I mean >is, the 'keys' function returns a list of all keys in a slice. Is >there a function to return a list of all keys in slice EXCEPT those >keys that I explicitely pass? like this, maybe: > >my %my_hash = ( > foo => 1, > bar => 2, > baz => 3, > qux => 4, >); > >my @other_keys = not_keys( %my_hash, "foo", "bar" ) > >and then @other_keys = qw( baz qux )
Write your own function. This is where prototypes come in handy: # declare the function BEFORE you use it # we could also define it here, but that might look ugly sub not_keys (\%@); # ... my @other_keys = not_keys(%my_hash, "foo", "bar"); # ... sub not_keys (\%@) { my $hash = shift; my %exclude; @[EMAIL PROTECTED] = (); # build hash of keys to exclude return grep !exists $exclude{$_}, keys %$hash; } -- Jeff "japhy" Pinyan % How can we ever be the sold short or RPI Acacia Brother #734 % the cheated, we who for every service http://japhy.perlmonk.org/ % have long ago been overpaid? http://www.perlmonks.org/ % -- Meister Eckhart -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>