Но только во втором случае обращение в lvalue приводит undef к пустой строке, 
что
и вызывает uninitialized warning

а в случае foo($bar{+undef});

подозреваю перевод undef в пустую строку сделано на этапе компиляции, поэтому
варнинг и не выскакивает

Анатолий Гришаев.

 26.12.2013, 12:15:02 пользователь Alexander Onokhov ([email protected])
 написал:


 lvalue, присваивание которому автовивифицирует элемент хеша в обоих случаях
 передаётся.


 2013/12/26 Анатолий Гришаев <[email protected]>



   Во втором случае передается lvalue, при обращении к нему и вылетает
   второе предупреждение.
   Можно закомментировать строчку с $val и посмотреть.
   А значение одно и тоже undef.

   Анатолий Гришаев.

     26.12.2013, 4:32:27 пользователь Denis Ibaev ([email protected])
     написал:

     Привет.

     Вот такой код

     sub foo { my ($val) = @_; }
     my %bar;
     my $undef;

     foo($bar{undef});
     foo($bar{$undef});
     выдаст на втором вызове функции foo() предупреждения

     Use of uninitialized value $undef in hash element
     Use of uninitialized value within @_ in list assignment

     При этом в первом вызове массив @_ будет содержать один элемент со
     значением undef, точнее алиас для $bar{"undef"}. Во втором же так же
     будет один элемент и как будто undef, но, судя по предупреждению, не
     совсем он. Похоже, что алиас на неопределённый элемент %bar. В чём же
     разница этих вызовов и для чего?

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

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



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

Ответить