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

Reply via email to