indietro

  • delete ESPR

    Data un'espressione che specifica un elemento di un hash o di un array, una porzione di hash o di array, cancella l'elemento o gli elementi specificati dall'hash o dall'array. Nel caso di un array, se gli elementi sono in fondo, la dimensione dell'array diminuirà fino al massimo elemento per il quale la condizione exists() è vera (oppure fino a 0, se tale elemento non esiste).

    Restituisce una lista con lo stesso numero di elementi che si è tentato di eliminare. Ogni elemento di questa lista consiste o nel valore dell'elemento eliminato, oppure nel valore undef. In contesto scalare, questo vuol dire che il valore restituito è il valore dell'ultimo elemento eliminato (o il valore indefinito se quell'elemento non esisteva).

        %hash = (pippo => 11, pluto => 22, paperino => 33);
        $scalare = delete $hash{pippo};               # $scalare e` 11
        $scalare = delete @hash{qw(pippo pluto)};     # $scalare e` 22
        @array   = delete @hash{qw(pippo pluto paperino)}; # @array e` (undef,undef,33)

    Cancellare da %ENV modifica l'ambiente. Cancellare da un hash legato ad un file DBM cancella le voci dal file DBM. Cancellare da un hash o array legato potrebbe non necessariamente restituire qualcosa.

    Cancellare effettivamente un elemento da un array riporta quella posizione dell'array al suo stato iniziale, non inizializzato. Successive verifiche con exists() dello stesso elemento restituiranno falso. Inoltre, cancellare elementi nel mezzo di un array non farà scorrere in basso l'indice degli elementi successivi. Usate splice() per questo. Si veda exists.

    Il seguente codice cancella (in maniera inefficiente) tutti i valori di %HASH e di @ARRAY:

        foreach $chiave (keys %HASH) {
            delete $HASH{$chiave};
        }
        foreach $indice (0 .. $#ARRAY) {
            delete $ARRAY[$indice];
        }

    Questi fanno la stessa cosa:

        delete @HASH{keys %HASH};
        delete @ARRAY[0 .. $#ARRAY];

    Ma entrambi risultano più lenti che l'assegnare semplicemente la lista vuota oppure rendere indefiniti %HASH o @ARRAY:

        %HASH = ();         # svuota completamente %HASH
        undef %HASH;        # dimentica che %HASH sia 
                            # mai esistito
        @ARRAY = ();        # svuota completamente @ARRAY
        undef @ARRAY;       # dimentica che %ARRAY sia
                            # mai esistito

    Va notato che ESPR può essere arbitrariamente complessa, purché l'operazione finale denoti l'elemento di un hash, di un array, una porzione di un hash o di un array:

        delete $ref->[$x][$y]{$chiave};
        delete @{$ref->[$x][$y]}{$chiave1, $chiave2, @altrechiavi};
        delete $ref->[$x][$y][$indice];
        delete @{$ref->[$x][$y]}[$indice1, $indice2, @altriindici];