Продвижение переменной undef в ARRAY ref в foreach - PullRequest
3 голосов
/ 26 июня 2019
use strict;                  
use warnings FATAL => 'all'; 

my $x = undef;               
if (@$x) { print "ok\n" }    
else { print "no\n" } 

Как и ожидалось, выдает "Не удается использовать неопределенное значение в качестве ссылки на массив" для if (@$x). Но вставив foreach (@$x):

use strict;                  
use warnings FATAL => 'all'; 

my $x = undef;               
foreach (@$x) { print $_ }  # <------- 
if (@$x) { print "ok\n" }    
else { print "no\n" }        

print ref($x)."\n"; 

Выходы:

no
ARRAY

Строка foreach, похоже, присвоила $x. Что с этим?

1 Ответ

4 голосов
/ 26 июня 2019

Автовивификация составляет

@$x

эквивалентно

@{ $x //= [] }

в контексте lvalue.

Используйте

if ($x) {
   for (@$x) {
      ...
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...