Im folgenden Beispiel versuche ich, ein Capture dynamisch zu erstellen, indem ich ein Array (@a) in ein Capture "konvertiere".
Betrachten Sie den Code:
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);
Das Ergebnis ist:
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 :
Der erste Lauf (mit Capture $ c1) wird ordnungsgemäß ausgeführt und erzeugt das gewünschte Verhalten. Der zweite und dritte Versuch, ein Capture dynamisch zu erstellen, schlagen fehl (wahrscheinlich, weil das Argument der Unterroutine f in diesen Fällen NICHT das gewünschte Capture ist). Ich beobachte, dass die in Array @a enthaltenen Paare als Mitglieder einer Liste und NICHT als Parameter bezeichnet werden, wie ich sie haben wollte.
Ich weiß, dass es sozusagen eine "Abflachung" der Paare im Array geben muss, bevor es zur Unterroutine f übergeht, aber ich kann NICHT herausfinden, wie das geht!
Kann mir jemand einen Hinweis geben?