Trong ví dụ sau, tôi cố gắng tạo một Capture một cách linh hoạt bằng cách "chuyển đổi" một mảng (@a) thành một Capture.
Hãy xem xét mã:
sub f (|c){
say '';
say ' List : ' ~ do {c.list.gist if c.list.elems > 0};
say ' Hash : ' ~ do {c.hash.gist if c.hash.elems > 0};
say '';
}
my $c1 = \(1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9);
my @a = 1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9;
my $c2 = \(|@a);
f(|$c1);
f(|@a);
f(|$c2);
Kết quả là:
List : (1 (2 3) 4 5 6 7 8 9)
Hash : Map.new((t1 => test1, t2 => test2))
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
Lần chạy đầu tiên (với Capture $ c1) đang chạy như bình thường, tạo ra hành vi mong muốn. Các nỗ lực thứ hai và thứ ba, để tạo một Capture một cách linh hoạt, đều thất bại (có thể là do đối số của chương trình con f trong các trường hợp đó KHÔNG phải là Capture mong muốn). Tôi quan sát rằng các cặp được kết hợp vào mảng @a, được coi là thành viên của danh sách và KHÔNG được đặt tên tham số như tôi muốn.
Tôi biết rằng phải có, nói, "làm phẳng" các cặp trong mảng đang diễn ra, trước khi chuyển sang chương trình con f, nhưng tôi KHÔNG thể tìm ra cách để làm điều đó!
Bất cứ ai có thể cho tôi một gợi ý?