ho visto questa riga di codice in alcune fontiUntainting un membro di hash benedetto con o senza l'eliminazione
($self->{arg}) = ((delete $self->{arg}) =~ /(.*)/s) if ${^TAINT};
Capisco l'untainting. Ho anche conosciuto delete
La mia domanda è, in quali circostanze è necessario o preferito usare il delete
, e non è sufficiente per utilizzare la più semplice
($self->{arg}) = (($self->{arg}) =~ /(.*)/s) if ${^TAINT};
Per esempio
#!/usr/bin/env perl -T
use 5.014;
use warnings;
package Some {
use Moose;
has 'arg' => (is => 'rw', isa => 'Str');
sub doit {
my $self = shift;
#($self->{arg}) = ((delete $self->{arg}) =~ /(.*)/s) if ${^TAINT};
($self->{arg}) = (($self->{arg}) =~ /(.*)/s) if ${^TAINT};
}
};
my $some = Some->new(arg => 'some text');
$some->doit();
say $some->arg;
Sono d'accordo con te. Modificare il valore di hash in posto (o, in questo caso, lasciarlo invariato) sembra essere equivalente all'eliminazione e al reinserimento. Puoi dire dove hai visto questa pratica? – Borodin
@Borodin l'ho visto https://metacpan.org/source/JSWARTZ/Mason-2.24/lib/Mason/Compilation.pm#L105 – Nemo
Può fare la differenza in caso di tie() s, ma non ne vedo nessuno qui . Boh. Non penserei mai di farlo. –