2010-10-13 43 views
0

Comment déréférencer un tableau de tableaux lorsqu'il est transmis à une fonction?Comment puis-je déréférencer un tableau de tableaux en Perl?

que je fais comme ceci:

my @a = {\@array1, \@array2, \@array3}; 

func(\@a); 


func{ 
    @b = @_; 

    @c = @{@b}; 
} 

En fait, je veux le tableau @c doit contenir les adresses des @array1, @array2 et @array3.

+3

Je ne pense pas '@a = {\ @ array1 , \ @ array2, \ @ array3} 'fait ce que vous pensez qu'il fait. – mob

+7

Tant de malentendus dans si peu de lignes de code. –

+0

Perl a des références, pas des pointeurs (comme C). Vous ne pouvez pas obtenir l'adresse d'une variable et vous n'en avez pas besoin. (Pour tout hacker Perl suffisamment expérimenté qui se sent obligé de souligner que ce n'est pas 100% précis: ne le faites pas, l'OP est déjà assez confus.) –

Répondre

7
my @a = {\@array1, \@array2, \@array3}; 

Ce qui précède est un tableau avec un seul élément -> a hachage contenant:

{ ''.\@array1 => \@array2, ''.\@array3 => undef } 

Parce que, comme une clé dans la table de hachage, Perl contraint la référence à @array1 dans une chaîne. Et Perl permet d'affecter une référence de hachage scalaire à un tableau, car il est "compris" que vous voulez un tableau dont le premier élément est le scalaire que vous lui avez assigné.

Vous créez un tableau de tableaux, comme ceci:

my @a = (\@array1, \@array2, \@array3); 

Et puis dans votre fonction que vous les déballer, comme ceci:

sub func { 
    my $ref = shift; 
    foreach my $arr (@$ref) { 
     my @list_of_values = @$arr; 
    } 
} 

ou une variante de celui-ci, comme disent une carte serait l'expression la plus facile:

my @list_of_entries = map { @$_ } @$ref; 

Dans votre exemple, @c comme une liste de adresses est simplement la même chose qu'un @a correctement construit.

-1

devrait être

func { 
    $b = shift; 
} 

si vous passez dans une référence. J'espère que cela aide certains.

0

Lisez la documentation perlreftut.

Modifier: D'autres soulignent un bon point que j'ai raté au début. Dans l'initialisation de @a, vous vouliez probablement soit @a = (...) (créer un tableau contenant des références) ou $arrayref = [...] (créer une référence à un tableau), et non {...} (créer une référence à un hachage). Le reste de ce post prétend que vous aviez la version @a = (...).

Puisque vous passez un argument (une référence à @a) à func, @_ est une liste contenant cette référence. Vous pouvez obtenir cette référence et déréférencer en faisant:

sub func { 
    my $arrayref = shift; 
    my @c = @{$arrayref}; 
} 

Ou dans une ligne, il ressemblerait à ceci:

sub func { 
    my @c = @{shift()}; 
} 

(Si vous ne l'aviez pas utilisé la barre oblique inverse dans func(\@a), @_ serait égal à @a, le tableau de trois références.)

5

Vous pouvez lire perldoc perlreftut, perldoc perlref et perldoc perldsc Vous pouvez dire:

sub func { 
    my $arrayref = shift; 

    for my $aref (@$arrayref) { 
     print join(", ", @$aref), "\n"; 
    } 
} 

my @array1 = (1, 2, 3); 
my @array2 = (4, 5, 6); 
my @array3 = (7, 8, 9); 

my @a = \(@array1, @array2, @array3); 

func \@a; 

ou plus compacte:

sub func { 
    my $arrayref = shift; 

    for my $aref (@$arrayref) { 
     print join(", ", @$aref), "\n"; 
    } 
} 

func [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; 
+0

salut merci beaucoup ... ça a bien marché .. merci beaucoup – jack