2010-10-07 4 views
6

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.

+1

Je pense que "fixer Data :: Aliases" pourrait être le meilleur (mais peut-être pas le plus rapide) à faire. :) – Ether

+0

@Ether => Une idée de la profondeur des incompatibilités? –

+0

@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

Répondre

1

Est-ce l'un des cas où vous pourriez vouloir une liste liée en Perl? Steve Lembark has a talk sur les différents cas où les gens devraient reconsidérer les tableaux déroulants et déroulants.

Je suis curieux de savoir pourquoi vous devez faire les choses de cette façon. Pas que je soupçonne quelque chose d'étrange; Je suis juste curieux du problème.

+0

la liste chaînée pourrait être une bonne solution, elle contourne joliment les problèmes 'O (n)'. l'application que j'ai en tête est de simuler Haskell comme comportement paresseux en Perl (principalement juste parce que je pense que je peux :), je voudrais finalement écrire quelque chose comme ça dans Perl: 'fibs = 0: 1: zipWith (+) fibs (tail fibs) 'et une partie de cela est la gestion des listes d'arguments qui peuvent contenir des valeurs qui n'ont pas encore été définies (mais seront au moment où elles sont nécessaires) –

+0

Oh, dans ce cas, attendez un an et utilisez Perl 6 Les listes paresseuses sont l'une des fonctionnalités les plus attrayantes pour moi. :) –

+0

@Eric, @brian, ou peut-être Perl 5.1x? (où x> 2 et x || 2) – Axeman

Questions connexes