Comment pouvez-vous concaténer des tableaux d'alias en Perl de sorte que le tableau résultant contienne aussi des alias?Comment concaténer des tableaux d'alias en Perl?
La solution que je suis venu avec est:
my ($x, $y, $z) = 1 .. 3;
my $a1 = sub {\@_}->($x);
my $a2 = sub {\@_}->($y, $z);
my $a3 = sub {\@_}->(@$a1, @$a2);
say "@$a3"; # 1 2 3
$_++ for $x, $y, $z;
say "@$a3"; # 2 3 4
Ce que je ne suis pas fou est que pour créer $a3
je dois déballer complètement $a1
et $a2
. Pour les tableaux courts, ce n'est pas un problème, mais à mesure que les données augmentent, cela signifie que toutes les opérations de tableau sur les tableaux avec alias sont O(n)
, y compris les opérations O(1)
comme push
ou unshift
.
Data::Alias
peut aider, mais cela ne fonctionne pas avec les dernières versions de Perl. Array::RefElem
contient des wrappers autour des primitives api av_store
et av_push
qui peuvent être utilisées pour implémenter cette fonctionnalité. Donc quelque chose comme ça pourrait fonctionner:
sub alias_push (\@@) {
if (eval {require Array::RefElem}) {
&Array::RefElem::av_push($_[0], $_) for @_[1 .. $#_]
} else {
$_[0] = sub {\@_}->(@{$_[0]}, @_[1 .. $#_])
}
}
Je suis intéressé de savoir s'il y a d'autres façons. Particulièrement s'il y a d'autres façons d'utiliser seulement les modules de base.
Je pense que "fixer Data :: Aliases" pourrait être le meilleur (mais peut-être pas le plus rapide) à faire. :) – Ether
@Ether => Une idée de la profondeur des incompatibilités? –
@Eric: non, bien que je soupçonne que quelqu'un a juste besoin de trouver un portage pour utiliser les liaisons de l'API 5.12. – Ether