2013-04-09 14 views
6

Sono novizio in Perl e sto leggendo sugli array.
Come ho capito gli array si espandono automaticamente in base alle esigenze (cool!)
Ma ho anche letto che possiamo utilizzare gli indici negativi per accedere agli array in ordine inverso.
E.g. un array di 3 elementi può essere letta come:
$array[0] $array[1] $array[2]
o
$array[-1] $array[-2] $array[-3] (in ordine inverso).
La mia domanda è cosa succede per valori inferiori a -3 ad es. $array[-5]?
L'array si espande o qualcosa del genere?Array e indici negativi in ​​Perl

+6

provarlo. Questi tipi di domande fanno bene a te stesso per risolvere te stesso – chrsblck

+3

perché non lo provi? – marcadian

+0

Posso provarlo ma sto cercando di capire il modello di memoria, se questo ha senso in Perl. Se non riesco a chiudere la domanda – Cratylus

risposta

9

Se lo si legge, il risultato è lo stesso di lettura $array[5] - il valore non esiste e ottieni un indebolimento. Andando via alla fine a sinistra e andando via alla fine a destra sono gli stessi.

Se lo scrivi, ricevi un errore. Gli array possono solo estendersi automaticamente a destra.

+0

Ho una build speciale di Perl dove i miei array mi affrontano prima zero-end. Possono solo estendersi automaticamente da me. – Borodin

0

Non si può, si getta l'errore:

Modifica del valore di matrice non creabile tentato, pedice -2

2

Si ottiene un valore undef se si legge il valore.

use strict; 
use warnings; 

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

uscita a stderr (programma continua a funzionare):

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

Oppure:

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

uscita:

undef 

Se si desidera assegnare un valore alla Si ottiene un errore:

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

uscita (programma esce):

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

E in realtà l'intervallo può essere modificato. Quindi, un array può iniziare a qualsiasi valore non solo 0.

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

uscita:

A 
B 
+1

'$ [' è deprecato; non usarlo. – ysth

+1

Sì, è deprecato. Ho mostrato solo come spezia. :) – TrueY