次の例では、配列(@a)をキャプチャーに「変換」することにより、キャプチャーを動的に作成しようとしています。
コードを考えてみましょう:
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);
結果は次のとおりです。
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 :
最初の実行(Capture $ c1を使用)は必要に応じて実行され、望ましい動作が生成されます。Captureを動的に作成する2番目と3番目の試行は失敗しています(おそらく、これらの場合のサブルーチンfの引数が目的のCaptureではないためです)。配列@aに組み込まれたペアは、リストのメンバーであると見なされ、名前付きパラメーターではないようになっていることがわかります。
サブルーチンfに渡す前に、配列内のペアの「平坦化」が行われている必要があることを知っていますが、その方法を理解できません。
誰かが私にヒントを与えることはできますか?