2009-06-22 8 views
2

Je veux être en mesure de placer un tableau dans un tableau. Par exemple, je peux avoir un tableau comme celui-ci:Comment ajouter un tableau ref au milieu d'un tableau existant en Perl?

my @array1 = ("element 1","element 2","element 3"); 

J'ai un autre tableau

my $array_ref = ["this will", "go between", "element 1 and 2"]; 

Je veux placer $array_ref dans la première de telle sorte que le premier tableau ressemble à ceci:

("element 1",["this will", "go between", "element 1 and 2"],"element 2","element 3") 

Je ne peux pas sembler faire ceci. J'ai regardé partout sur Google et n'ai rien trouvé.

+0

Le second est pas un tableau. C'est une référence de tableau. –

+1

Vérifiez 'perldoc perlreftut' pour un excellent bref tutoriel sur les références en Perl. – Telemachus

Répondre

1

Essayez d'avoir un tableau temporaire, comme ceci:

@temp_arr = ("this will", "go between", "element 1 and 3"); 
@my_arr = ("element 1", \@temp_arr, "element 3"); 

Vous pouvez utiliser les sous-éléments comme celui-ci:

print $my_arr[1]->[0]; # prints 'this will' 

Référez-vous au sous-tableau comme ceci:

print @$my_arr[1]; # Right! Prints 'this willgo betweenelement 1 and 2' 

# Don't do this: 
print $my_arr[1]; # Wrong! Prints something like: 'ARRAY(0xDEADBEEF)' 
+0

Je suis d'accord, utilisez des références. –

7

Vous utilisez donc splice pour remplacer 0 éléments commençant par l'élément 1 (le deuxième élément, le premier est l'élément 0) h vos éléments souhaités:

splice(@array, 1, 0, ["this will", "go between", "element 1 and 2"]); 

Ou peut-être vous dire:

splice(@array, 1, 0, "this will", "go between", "element 1 and 2"); 

si vous ne voulez pas les tableaux imbriqués.

+0

Je pense qu'il voulait dire insérer dans un tableau existant aussi. Pas totalement clair cependant. –

1

Ce que vous avez est un tableau et une référence de tableau.

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = ("element 1","element 2","element 3"); 
my $arrayref = ["this will", "go between", "element 1 and 2"]; 

splice(@array, 1, 0, $arrayref); # Grow the array with the list (which is $arrayref) 

for (my $i = 0; $i <= $#array; $i++) { 
    print "\@array[$i] = $array[$i]\n"; 
} 
4

Le point important à retenir est la distinction entre() et []. '()' vous donne une liste d'éléments, par exemple. (1, 2, 3) vous pourriez attribuer à une variable de tableau comme si -

my @listOfElem = (1, 2, 3); 

« [] » est un array reference et retourne une valeur scalaire que vous pouvez intégrer dans votre liste.

my $refToElem = ['a', 'b', 'c']; 

Dans votre cas, si vous initialisez le premier tableau alors vous pouvez simplement insérer les seconds éléments de tableau comme si,

my @listOfElem = (1, 2, ['a', 'b', 'c'], 3); 
#This gives you a list of "4" elements with the third 
#one being an array reference 

my @listOfElem = (1, 2, $refToELem, 3); 
#Same as above, here we insert a reference scalar variable 

my @secondListOfElem = ('a', 'b', 'c'); 
my @listOfElem  = (1, 2, \@secondListOfElem, 3); 
#Same as above, instead of using a scalar, we insert a reference 
#to an existing array which, presumably, is what you want to do. 

#To access the array within the array you would write - 
$listOfElem[2]->[0] #Returns 'a' 
@{listOfElem[2]}[0] #Same as above. 

Si vous devez ajouter les éléments du tableau à la volée dans la Au milieu du tableau, il suffit d'utiliser 'splice' comme détaillé dans les autres messages.

3

C'est le genre de chose que vous allez comprendre après avoir passé la première partie de Intermediate Perl, qui couvre les références et les structures de données. Vous pouvez également regarder dans le Perl data structures cookbook.

En bref, vous stockez un tableau dans un autre tableau en utilisant une référence (qui est juste un scalaire):

my @big_array = ($foo, $bar, \@other_array, $baz); 

Dans votre cas, vous avez utilisé le constructeur de tableau anonyme et que vous voulez juste qu'il épissure dans un tableau existant. Il n'y a rien de spécial étant une référence de tableau:

splice @big_array, $offset, $length, @new_items; 

Dans votre cas, vous vouliez commencer à l'élément 1, supprimer 0 éléments et ajoutez votre référence:

splice @big_array, 1, 0, $array_ref; 
1

Utilisez splice.

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 
my @array1 = ("element 1", "element 2", "element 3"); 
my $array_ref = ["this will", "go between", "element 1 and 2"]; 
splice(@array1, 1, 0, $array_ref); 
print Dumper \@array1; 

Cette imprimera les éléments suivants:

$VAR1 = [ 
      'element 1', 
      [ 
      'this will', 
      'go between', 
      'element 1 and 2' 
      ], 
      'element 2', 
      'element 3' 
     ];