Sorry for the repeat, but the upload server removed newlines from my description, rendering it practically unreadable. Here is the more readable form:
theo # 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'} # $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 # Perl Authors Upload Server writes: > > 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