2016-10-25 11 views
16

Tôi tự hỏi tại sao một cuộc gọi đến map trong đoạn thứ hai khiến lỗi 'giá trị không xác định' biến mất?Tại sao bản đồ() che dấu lỗi 'giá trị không xác định'?

use strict; 
use warnings; 
my $x; 
my @a = @{ $x }; # error: Can't use an undefined value as an ARRAY reference 

So sánh với:

use strict; 
use warnings; 
my $x; 
my @a = map $_, @{ $x }; # no error, @a is empty 

Trả lời

17

Điều này là do cách mà map() làm răng cưa (về cơ bản, sử dụng một vòng lặp for()). Những gì đang xảy ra là isf đang được sử dụng trong bối cảnh giá trị l, và do đó đang được auto-vivified vào sự tồn tại.

Trong ví dụ trước, bạn đang cố gắng sử dụng hàm aref trực tiếp trong ngữ cảnh giá trị r, đó là lý do tại sao nó tạo ra lỗi (vì không có sự tự động hóa xảy ra).

Bạn có thể đơn giản hóa thử nghiệm của bạn để sử dụng for(), và bạn sẽ nhận được kết quả tương tự như với map():

use warnings; 
use strict; 

my $x; 

for (@{ $x }){ 
    print "$_\n"; 
} 

... không có đầu ra.

Để trực quan thấy rằng $x được tự động vivified như một tài liệu tham khảo mảng, bạn có thể sử dụng ref() chức năng:

my $x; 
my @a = map $_, @{ $x }; 

print ref $x; 

Output:

ARRAY 
+3

cũng 'ref ($ x) 'sẽ hiển thị sự tự động hóa đó xảy ra. –

+1

@ Сухой27 cảm ơn! Tôi không nghĩ về điều đó vào lúc đó; câu trả lời được cập nhật – stevieb

Các vấn đề liên quan