0

Ich habe ein Problem beim Drucken eines Arrays, das Arrays enthält. Beim Drucken des Arrays @dev, das die anderen Arrays enthält, kann ich nur die ersten drei drucken, wie es durch die #printing Inline-Kommentare angezeigt wird. Die kommentierte Zeile #print($dev[4][2]); funktioniert gut, ebenso wie jede andere Kombination von Zahlen innerhalb des zulässigen Bereichs. Aus irgendeinem Grund funktioniert die for-Schleife nicht. Hilfe!?Drucken "Multi-Dimensional" Array in Perl

my @dev; 
my @tf; 
my @a; 
my @t; 
my @f; 
my @ofv; 
my @tfv; 

@tf = ('123456787', '123456788', '123456789'); #printing 
@a = (78, 65, 57); #printing 
@t = (70, 55, 42); #printing 
@f = (77, 64, 56); 
@ofv = ('true', 'false', 'false'); 
@tfv = ('false', 'true', 'true');  

@dev = (
    [@tf], 
    [@a], 
    [@t], 
    [@f], 
    [@ofv], 
    [@tfv], 
); 

#print($dev[4][2]); 

for (my $i = 0; $i <= (scalar(@tf) - 1); $i++) { 
    for (my $j = 0; $j <= (scalar(@dev) - 1); $j++) { 
     print($dev[$i][$j]); 
     print("\n"); 
    } 
} 

Vielen Dank.

+2

Versuchen Sie einen Blick auf http://stackoverflow.com/questions/34529090/how-to-iterate-the-contents-of-multimentional-array-in-parallel-using-perl/34529824#34529824 Benutzer Sobrique und Benutzer Borodin Antworten werden Ihnen helfen. – mkHun

+0

Anstelle von "skalar (@t) -1" ist es normalerweise besser, '$ # t' zu verwenden, welches der Index des letzten Elements ist. – Sobrique

Antwort

1

Ihre äußerste for-Schleife wird durch die Länge von t, die 3 ist, eingeschränkt. Es wird nie mehr als drei Arrays drucken.

Wenn ich verstehe, was Sie zu tun versuchen, brauchen Sie Top-Swap @ t und @dev. Das wird alle deine Werte drucken.

Das wird jedoch kein Array drucken, das länger als 3 (die Länge des Dev) ist.

Dafür benötigen Sie:

@dev = (
    [@tf], # Probably meant tf 
    [@a], 
    [@t], 
    [@f], 
    [@ofv], 
    [@tfv], 
); 

#print($dev[4][2]); 

for (my $i = 0; $i < @dev; $i++) { 
    for (my $j = 0; $j < @{ $dev[$i] }; $j++) { 
     print($dev[$i][$j]); 
     print("\n"); 
    } 
} 
3

Perl recht kompakt sein kann. Dieser Code-Schnipsel das gleiche tun für meine Arrays @ arr1, @ arr2 und @ arr3:

@arr1 = (1..10); 
@arr2 = ('a'..'j'); 
@arr3 = ('.') x 10; 

@multid = \(@arr1, @arr2, @arr3); 
print "@$_\n" for (@multid); 

OUTPUT:

1 2 3 4 5 6 7 8 9 10 
a b c d e f g h i j 
. . . . . . . . . . 

Auch die [] Kopien ein Array und gibt einen Verweis darauf (Es ist ein anonymes Array im Speicher, unabhängig vom Array, von dem er eine Kopie ist. Wenn ein solches Duplikat nicht benötigt wird, ist es besser, den Backslash \ zu verwenden, der stattdessen einen Verweis auf existierendes Array ohne Coping gibt. (wie & Betreiber in C, wie sagen Sie uns perldoc)

+0

können Sie den '() x' wiederholen Operator:' @ arr3 = ('.') X 10; ' – ysth

+0

Natürlich korrigiert, danke – red0ct

3

Wenn Sie nur die Daten von solch komplexen Datenstruktur anzeigen möchten, können die Module Data::Dumper oder Smart::Comments gute Optionen sein.

use Data::Dumper; 
print Dumper(\@dev); 

oder

use Smart::Comments; 
### @dev 

Der Ausgang ist viel mehr Perl-Stil und nicht lesbar, aber ist sehr bequem, die Struktur solcher komplexen Daten zu zeigen.

+3

Eigentlich [Daten :: Drucker] (http://p3rl.org/ Data :: Printer) ist viel besser zum Inspizieren als Data :: Dumper, da letzterer eine maschinenlesbare Ausgabe erzeugen soll. – simbabque