No exemplo a seguir, tento criar um Capture dinamicamente "convertendo" uma matriz (@a) em um Capture.
Considere o código:
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);
O resultado é:
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 :
A primeira execução (com o Capture $ c1) está sendo executada como deveria, produzindo o comportamento desejado. A segunda e terceira tentativas, para criar uma Captura dinamicamente, estão falhando (provavelmente porque o argumento da sub-rotina f nesses casos NÃO é a Captura desejada). Observo que os pares incorporados na matriz @a são considerados membros de uma lista e NÃO nomeados parâmetros como eu queria que fossem.
Eu sei que deve haver, de certa forma, um "achatamento" dos pares da matriz, antes de passar para a sub-rotina f, mas NÃO consigo descobrir o caminho para fazer isso!
Alguém pode me dar uma dica?