Только, что заметил, что

foo($bar{+undef});

foo($bar{$undef});

обрабатываются одинаково.

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

 26.12.2013, 12:25:39 пользователь Анатолий Гришаев ([email protected])
 написал:


 Но только во втором случае обращение в 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

Ответить