The following module was proposed for inclusion in the Module List: modid: Tie::Silk DSLIP: bdprp description: Indexed hash prepend w/ `-' to get index/key userid: DIRT (Theo Lengyel) chapterid: 6 (Data_Type_Utilities) communities:
similar: Tie::IxHash rationale: Tie::Silk - Silk = Somewhat Intuitive List Knitter This is an indexed hash with some added strange behavior. It is useful for keeping track of several related lists based on the same key set. When an (existing) key is prepended with a `-' (minus sign - regular keys may NOT begin with a `-') it returns the index for that element. When an index (integer) is used to access the hash it acts like an array (new values may NOT be introduced with integer keys) and returns/sets the VALUE in that slot. When an integer is prepended with a `-' it returns/sets the corresponding KEY for that slot. When accessed with normal text keys is behaves like a normal hash, except that order is preserved. # this is a hash that also acts like a funny array. It preserves order # like an array(akin to Tie::IxHash), but also has some other specific # behavior that is described below ( the `===' I am using here to mean # `equivalent to') # where $x is an integer $x >= 0 # then $h{$x} === $h{$h{"-$x"}} # # here is a sample hash: # $th = tie %h, __PACKAGE__ # %h = qw( _foo bar # _baz fup # ); # Taowebs::Tie::Silk; these are the behaviors we are after: # 1) when accessed with a negative number it returns the hash hey for # the indicated pair(need to be careful with a `minus zero' key # MUST be a string because perl compiler will convert an unquoted -0 to 0) # $h{'-0'} === _foo # $h{-1} === _baz # 2) when accessed with a positive integer it returns the value for # the associated key pair (same as fetching it with the normal # hash key, but now we are accessing it with pseudo-array indexing # using {} instead of [] notation) # $h{0} === bar === $h{_foo} === $h{$h{'-0'}} # $h{1} === fup === $h{_baz} === $h{$h{-1}} # $h{_baz} === fup # $h{_foo} === bar # 3) a normal hash key preceded by a `-' (minus sign) returns the # index of that pair ( except when setting a value this way, see #4) # $h{-_baz} === 1 # $h{-_foo} === 0 # 4) when setting an element and preceding the hash key with a minus # sign `-' this actually replaces the hash key with the value # therefore we have: # $h{-_foo} = '_new_foo' === $h{'-0'} # equivalently: # $h{'-0'} = '_new_foo' === $h{'-0'} # $h{_new_foo} === bar # $h{-_new_foo} === 0 # $h{'-0'} === _new_foo # 5) you cannot set a new slot with an integer unless the integer matches the next open slot, otherwise confusion may ensue # enteredby: DIRT (Theo Lengyel) enteredon: Thu Nov 6 19:38:15 2003 GMT The resulting entry would be: Tie:: ::Silk bdprp Indexed hash prepend w/ `-' to get index/key DIRT Thanks for registering, -- The PAUSE PS: The following links are only valid for module list maintainers: Registration form with editing capabilities: https://pause.perl.org/pause/authenquery?ACTION=add_mod&USERID=73500000_95e73362a06ea6fb&SUBMIT_pause99_add_mod_preview=1 Immediate (one click) registration: https://pause.perl.org/pause/authenquery?ACTION=add_mod&USERID=73500000_95e73362a06ea6fb&SUBMIT_pause99_add_mod_insertit=1