В опкодах в первом случае
 
7        <1> rv2hv[t2] lK/3 ->8
 
во втором: 
 
7           <1> rv2hv[t2] lKRM/DREFed,3 ->8
 
выглядит так, будто для keys() требуется, чтобы аргумент был lvalue.
lvalue из undef автовивифицируется, это факт.
 
Непонятно мне только, зачем аргументу keys быть lvalue?
 
 
19.11.2013, 12:19, "Ilya Chesnokov" <[email protected]>:
2013/11/19 Denis Ibaev <[email protected]>
Привет.

> perl -E 'use strictures; my $v; say(%$v);'
Can't use an undefined value as a HASH reference at -e line 1.

> perl -E 'use strictures; my $v; say(keys(%$v), "ok");'
ok

Почему разыменование переменной со значением undef в хеш не вызывает
ошибки с случае keys() и values()?
 
Видимо, keys и пр. автовивифицируют $v:
 
perl -Mstrict -E 'my $v; say "keys: ", keys %$v; say "v: ", $v'
keys: 
v: HASH(0x96bde8)
 
 
 
> perl -v
This is perl 5, version 14, subversion 2 (v5.14.2) built for
x86_64-linux-gnu-thread-multi

--
Денис Ибаев
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org


 
--
Best regards,
Ilya Chesnokov
,

--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

 
 
--
Oleg Alistratov
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить