[Moscow.pm] reverse изменяет аргумент

Ruslan Zakirov ruz на bestpractical.com
Пн Окт 1 10:06:18 PDT 2012


2012/10/1 Denis Evdokimov <evdokimov.denis на gmail.com>:
> А знаете ли вы, что reverse изменяет свой агрумент?
> В этом легко убедиться с помощью JSON или Devel::Peek :
>
> perl -MJSON -e'my %a=(int => 222); print to_json \%a; my %b=reverse %a;

Это не reverse, а aassign. Reverse кладет на стек альясы, а не копии.
Сделано для лупов. А aassign полученые значения использует для
создания хеша и то что раньше было значением становится ключом.

Вот еще один пример:

perl -MJSON -E 'my %h = (1..4); $_."" for values %h; say to_json \%h'

В доке к JSON есть описание того как происходит конвертация. Мне
казалось, что где-то я видел опцию, которая переворачивает ситуацию,
но я точно не помню.

> print to_json \%a;'
> {"int":222}{"int":"222"}
>
> perl -MDevel::Peek -e'my %a=(int => 222); Dump $a{int}; my %b=reverse %a;
> Dump $a{int};'
> SV = IV(0x1036d40) at 0x1036d48
>   REFCNT = 1
>   FLAGS = (IOK,pIOK)
>   IV = 222
> SV = PVIV(0x1051220) at 0x1036d48
>   REFCNT = 1
>   FLAGS = (IOK,POK,pIOK,pPOK)
>   IV = 222
>   PV = 0x1056220 "222"\0
>   CUR = 3
>   LEN = 8
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm