2011-11-07 36 views
9

xem xét mã này:Làm cách nào để biến một mảng được trả về từ một hàm (như phân tách) thành tham chiếu mảng?

@tmp = split(/\s+/, "apple banana cherry"); 
$aref = \@tmp; 

Bên cạnh việc thanh nha, các mã trên là mong manh. Nói rằng tôi theo dõi nó với dòng này:

@tmp = split(/\s+/, "dumpling eclair fudge"); 

Bây giờ $$aref[1] là "eclair" thay vì "chuối".

Làm cách nào để tránh sử dụng biến tạm thời?

Về mặt lý thuyết, tôi đang nghĩ đến một cái gì đó giống như

$aref = \@{split(/\s+/, "apple banana cherry")}; 
+4

Chức năng không thể trả về mảng. 'split' trả về một danh sách các vô hướng, giống như bất kỳ phụ nào. – ikegami

Trả lời

19

Bạn có thể làm điều này nếu bạn muốn có một mảng ref:

my $aref = [ split(/\s+/, "apple banana cherry") ]; 
3

I figured it out:

$aref = [split(/\s+/, "apple banana cherry")]; 
2

Trong khi tôi thích câu trả lời của mu (và sẽ sử dụng cách tiếp cận đầu tiên ở đây), hãy nhớ rằng các biến có thể khá dễ bị scoped, thậm chí với cảo ut sử dụng các chức năng, hãy tưởng tượng:

my $aref = do { 
    my @temp = split(/\s+/, "apple banana cherry"); 
    \@temp; 
}; 
print join("-", @$aref), "\n"; 
# with warnings: Name "main::temp" used only once: possible typo at ... 
# with strict: Global symbol "@temp" requires explicit package name at ... 
print join("-", @temp), "\n"; 

Mã hóa hạnh phúc.

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