Tuesday, July 12, 2016

Hash keys

Наткнулся на интересную и нетривиальную языковую особенность, при которой ключи хеша в итоге интерпретируются не совсем очевидно, но в то же время достаточно логично:


# foo.pl:

#!/usr/bin/env perl

use Data::Dumper;

my %hash = (
   '-'   => { -key   => 'value' },
   '+'   => { +key   => 'value' },
   '-+'  => { -+key  => 'value' },
   '+-'  => { +-key  => 'value' },
   '-+-' => { -+-key => 'value' },
);
print Dumper \%hash;

# output:
$VAR1 = {
         '-' => {
                  '-key' => 'value'
                },
         '-+' => {
                   '-key' => 'value'
                 },
         '-+-' => {
                    '+key' => 'value'
                  },
         '+-' => {
                   '-key' => 'value'
                 },
         '+' => {
                  'key' => 'value'
                }
       };

Посмотрим, каким такое объявление хеша видит интерпретатор:

perl -MO=Deparse foo.pl

my (%hash) = (
 '-',   {-'key', 'value'},
 '+',   {'key',  'value'},
 '-+',  {-'key', 'value'},
 '+-',  {-'key', 'value'},
 '-+-', {-(-'key'), 'value'}
);

Как видим, интерпретация осуществляется согласно математических правил, ключ воспринимается не как строка, а как число, то есть плюс необязателен (по умолчанию все числа с плюсом), минус меняет знак на противоположный:

'-',   {-'key',    меняет знак, поэтому -key
'+',   {'key',    необязателен, поэтому просто key
'-+',  {-'key,    меняет знак положительного числа, поэтому -key
'+-',  {-'key,    сначала меняет знак, плюс необязателен, поэтому -key
'-+-', {-(-'key'), меняет знак, плюс необязателен, затем опять меняет знак (с отрицательного уже на положительный), поэтому +key

No comments: