2010-10-14 8 views
1

J'ai encore une fois oublié comment obtenir $_ pour représenter un tableau quand il est dans une boucle d'un tableau à deux dimensions.Comment puis-je extraire un tableau d'un tableau bidimensionnel en Perl?

foreach(@TWO_DIM_ARRAY){ 
    my @ARRAY = $_; 
} 

C'est l'intention, mais cela ne fonctionne pas. Quelle est la bonne façon de faire cela?

+0

Pouvez-vous montrer les données que vous commencez avec et ce que vous voulez finir avec, même si pseudocode? –

Répondre

5

La ligne my @ARRAY = @$_; (au lieu de = $_;) est ce que vous êtes Vous cherchez, mais à moins que vous ne vouliez explicitement faire une copie du tableau référencé, j'utiliserais @ $ _ directement.

Eh bien, en fait je ne voudrais pas utiliser $_ du tout, d'autant plus que vous êtes susceptible de vouloir itérer @$_, et vous utilisez $_ implicite dans la boucle interne aussi, et alors vous pourriez avoir un gâchis déterminer qui est $_, ou si c'est même légal. Ce qui pourrait avoir été pourquoi vous copiez dans @ARRAY en premier lieu.

Quoi qu'il en soit, voici ce que je ferais:

for my $array_ref (@TWO_DIM_ARRAY) { 

    # You can iterate through the array: 
    for my $element (@$array_ref) { 
     # do whatever to $element 
    } 

    # Or you can access the array directly using arrow notation: 
    $array_ref->[0] = 1; 
} 
+1

+1 pour la syntaxe for my $ var. On dirait que beaucoup de gens ne s'en soucient pas, bien que cela améliore beaucoup la lisibilité. – Sorpigal

+0

Cependant, pourquoi cela ne marche-t-il pas: foreach (@TWO_DIM_ARRAY) {print join ',', @ {$ _}; } Après tout, $ _ est une référence de tableau, et @ {$ _} devrait être un tableau. –

+0

@Michael Goldshteyn: Cela fonctionnera aussi. '@ {$ _}' est identique à '@ $ _'. Par exemple, j'ai juste essayé ceci: 'my @A = ([1,2,3], [4,5,6], [7,8,9]); foreach (@A) {print join (",", @ {$ _}), "\ n"; } ' – Jander

4
for (@TWO_DIM_ARRAY) { 
    my @arr = @$_; 
} 
4

Le $_ seront tableau références (non tableaux), de sorte que vous devez déréférencer comme:

my @ARRAY = @$_;