Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

cancellare elementi da array

16 views
Skip to first unread message

liftman

unread,
Apr 6, 2015, 12:46:30 PM4/6/15
to
Continuando con i miei "esperimenti...

questo il listato di prova:

#!/usr/bin/perl
use strict;
my @array = qw(tizio pippo caio sempronio gino pino lino dino nino);
my $indice = "";
print "@array \r\n";
foreach $indice (0.. $#array) {
if ($array[$indice] eq 'pippo') {
delete $array[$indice];
}
}
print "@array $#array \r\n";

e questo l'output:

tizio pippo caio sempronio gino pino lino dino nino
Use of uninitialized value in join or string at prova2.pl line 12.
tizio caio sempronio gino pino lino dino nino 8

la riga incriminata è l'ultima: (print "@array $#array \r\n";) però non
capisco l'errore, se commento la riga ovviamente l'errore sparisce, ma sarei
più contento di capire il perchè. L'intento della prova come si nota è di
cancellare un elemento arbitrario dall'array, nell'uso che ne vorrei fare il
"pippo" verrà sostituito da una variabile.


--
Fri(END), Boyfri(END), Girlfri(END), Bestfri(END). Everything has an END
except...Fam(ILY)! It Has 3 Letters that say I LOVE YOU

Andrea Maestrutti

unread,
Apr 6, 2015, 4:24:03 PM4/6/15
to
liftman wrote:

> foreach $indice (0.. $#array) {
> if ($array[$indice] eq 'pippo') {
> delete $array[$indice];
> }
> }

Qui stai ciclando da 0 all'ultimo indice dell'array iniziale MA nel
mentre togli un elemento all'array. Dunque all'ultimo ciclo del for, il
$#array iniziale č piů grande del $#array corrente. Dunque farai
riferimento ad un elemento dell'array non piů esistente.

Ti consiglio funzioni come splice. C'č una buona guida qui:

<http://www.perl.it/documenti/articoli/2007/12/array-ed-hash.html>.

liftman

unread,
Apr 6, 2015, 6:43:31 PM4/6/15
to

"Andrea Maestrutti" <maest...@friuli.com> ha scritto nel messaggio
news:mfuq0u$e9a$1...@speranza.aioe.org...

> Qui stai ciclando da 0 all'ultimo indice dell'array iniziale MA nel mentre
> togli un elemento all'array. Dunque all'ultimo ciclo del for, il $#array
> iniziale è più grande del $#array corrente. Dunque farai riferimento ad un
> elemento dell'array non più esistente.

Ah ecco.. :-)

> Ti consiglio funzioni come splice. C'è una buona guida qui:

ci butto un occhio...
Ho dato una scorsa sommaria e credo di aver capito che se modifico così:

foreach $indice (0.. $#array) {
if ($array[$indice] eq 'pippo') {
$elemento = $indice;
}
splice (@array, $elemento, 1);
}

ottengo il risultato prefisso, o c'è un sistema migliore?
In ogni caso l'array al massimo potrà contenere qualche centinaio di
elementi (3-400), anche se non è efficiente come sistema per i miei usi
basta ed avanza, tanto quello che faccio è un passatempo.

Grazie per l'aiuto.

liftman

unread,
Apr 8, 2015, 9:29:10 AM4/8/15
to

"liftman" <liftman_...@moredifficult.org> ha scritto nel messaggio
news:mfv26i$17r$1...@speranza.aioe.org...

>> Ti consiglio funzioni come splice. C'č una buona guida qui:
>
> ci butto un occhio...
> Ho dato una scorsa sommaria e credo di aver capito che se modifico cosě:
>
> foreach $indice (0.. $#array) {
> if ($array[$indice] eq 'pippo') {
> $elemento = $indice;
> }
> splice (@array, $elemento, 1);
> }
>
> ottengo il risultato prefisso, o c'č un sistema migliore?

Mi rispondo da solo... non funziona :-)
il codice incriminato č questo:

foreach $indice (0.. $#database) {
if ($database[$indice] eq $temp) { #riga 108
$elemento = $indice;
}
splice (@database, $elemento, 1); #riga 111
store(\@database, "$file");
}

il risultato č che ottengo questo: (e l'elemento non viene cancellato)

Argument "" isn't numeric in splice at prova.pl line 111, <GEN0> line 46.
Use of uninitialized value in string prova.pl line 108, <GEN0> line 46.

Quindi dopo miliardi (si ok, erano qualcuna meno...) di ricerche e letture
di testi piů o meno tutti uguali (č uno dei problemi della rete, un pirla
scrive un minitutorial, e 3 milioni lo copiano sui loro siti fetenti, e lo
spacciano per proprio, magari senza nemmeno sapere se funziona...) ho
trovato quello che mi serviva, qua:
http://stackoverflow.com/questions/174292/what-is-the-best-way-to-delete-a-value-from-an-array-in-perl
ed ho modificato il mio script cosě:

my $index = 0;
$index++ until $database[$index] eq $temp;
splice (@database, $index, 1);

e pare funzionare! :-)
Avrei un altro quesito, ma apro thread apposito..
0 new messages