2013-04-09 10 views
6

Ich bin Neuling in Perl und ich lese über Arrays.
Wie ich verstehe, die Arrays automatisch erweitern wie benötigt (cool!)
Aber ich lese auch, dass wir negative Indizes verwenden können, um auf die Arrays in umgekehrter Reihenfolge zuzugreifen.
Zum Beispiel
$array[0] $array[1] $array[2]
oder
$array[-1] $array[-2] $array[-3] (in umgekehrter Reihenfolge): Ein Array von 3 Elementen kann als zugegriffen werden.
Meine Frage ist, was passiert für Werte kleiner als -3 z. ?
Erweitert sich das Array oder etwas?Arrays und negative Indizes in Perl

+6

Testen Sie es aus. Diese Art von Fragen sind gut für dich, um selbst zu trainieren. – chrsblck

+3

warum versuchst du es nicht einfach? – marcadian

+0

Ich kann es ausprobieren, aber ich versuche, das Speichermodell zu verstehen, wenn das in Perl Sinn macht. Wenn ich nicht die Frage – Cratylus

Antwort

9

Wenn Sie es lesen, ist das Ergebnis das gleiche wie $array[5] Lesen - der Wert existiert nicht und du bekommst ein undef heraus. Vom Ende nach links zu gehen und vom Ende nach rechts zu gehen, ist dasselbe.

Wenn Sie es schreiben, erhalten Sie einen Fehler. Arrays können nur automatisch nach rechts erweitert werden.

+0

Ich habe eine spezielle Perl-Version, bei der mir meine Arrays zuerst das Null-Ende geben. Sie können sich nur automatisch von mir entfernen. – Borodin

0

Sie können nicht, den Fehler auslöst:

Modifikation von nicht-creatable Array-Wert versucht, Index -2

2

Sie erhalten einen undef Wert, wenn Sie den Wert lesen.

use strict; 
use warnings; 

my @l = qw(A B C); 
print $l[-4]; 

Ausgabe auf stderr (Programm läuft weiter):

Use of uninitialized value in print at ./x.pl line 7. 

Oder:

my @l = qw(A B C); 
print "undef" if !defined $l[-4]; 

Ausgang:

undef 

Wenn Sie möchten einen Wert zuweisen Sie erhalten einen Fehler:

my @l = qw(A B C); 
$l[-4] = "d"; 

Ausgang (Programm beendet):

Modification of non-creatable array value attempted, subscript -4 at ./x.pl line 7. 

Und tatsächlich kann das Intervall geändert werden. So kann ein Array einen beliebigen Wert beginnen nicht nur 0.

my @l = qw(A B C); 
$[ = -4; # !!! Deprecated 
print $l[-4], "\n"; 
print $l[-3], "\n"; 

Ausgang:

A 
B 
+1

'$ [' ist veraltet; benutze es nicht. – ysth

+1

Ja, es ist veraltet. Ich zeigte nur als Gewürz. :) – TrueY

Verwandte Themen