<div dir="ltr">19 ноября 2013 г., 14:28 пользователь Denis Ibaev <span dir="ltr"><<a href="mailto:dionys@gmail.com" target="_blank">dionys@gmail.com</a>></span> написал:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">>> Почему разыменование переменной со значением undef в хеш не вызывает<br>

>> ошибки с случае keys() и values()?<br>
><br>
> Видимо, keys и пр. автовивифицируют $v:<br>
><br>
> perl -Mstrict -E 'my $v; say "keys: ", keys %$v; say "v: ", $v'<br>
> keys:<br>
> v: HASH(0x96bde8)<br>
<br>
</div>Но это нигде не описано, похоже.<br>
<br></blockquote><div><br></div><div>Согласен - даже наоборот, похоже на баг ибо (из <a href="http://perldoc.perl.org/perl5140delta.html">http://perldoc.perl.org/perl5140delta.html</a>):</div><div><br></div><div><div>       ·   When strict "refs" mode is off, "%{...}" in rvalue context returns "undef" if its argument is undefined.  An optimisation introduced in Perl 5.12.0 to make "keys %{...}" faster when used as a boolean did not take this into account, causing "keys %{+undef}" (and "keys %$foo" when $foo is undefined) to be an error, ___***which it should be so in strict mode***___ only [perl #81750].</div>
</div><div><br></div><div>И ещё нашёл в perlfunc:</div><div><div>               undef $ref;</div><div>               if (exists $ref->{"Some key"})    { }</div><div>               print $ref;  # prints HASH(0x80d3d5c)</div>
<div><br></div><div>           This surprising autovivification in what does not at first--or even second--glance appear to be an lvalue context may be fixed in a future release.</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Как правильно заметил Андрей Фёдоров, нижеследующий текст не об этом случае:<br>
<div class="im"><br>
Starting with Perl 5.14, keys can take a scalar EXPR, which must<br>
contain a reference to an unblessed hash or array. The argument will<br>
be dereferenced automatically. This aspect of keys is considered<br>
highly experimental. The exact behaviour may change in a future<br>
version of Perl.<br>
<br>
</div><div class=""><div class="h5">--<br>
Денис Ибаев<br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Best regards,<br>Ilya Chesnokov
</div></div>