2015-11-15 8 views
12

ずに祝福されたハッシュメンバーを汚染を取り除く私はいくつかのソース または削除

($self->{arg}) = ((delete $self->{arg}) =~ /(.*)/s) if ${^TAINT}; 

私は汚染を取り除くを理解するには、このコード行を見ました。私も知ら delete

私の質問はどのような状況では、それが必要かdeleteを使用するのが好ましい、であり、それは例えば

($self->{arg}) = (($self->{arg}) =~ /(.*)/s) if ${^TAINT}; 

単純

#!/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; 
+1

できます。その場でハッシュ値を変更する(または、この場合は変更しない)ことは、ハッシュ値を削除して再挿入するのと同じように見えます。この練習をどこで見たことがありますか? – Borodin

+0

@Borodin私はそれを見たhttps://metacpan.org/source/JSWARTZ/Mason-2.24/lib/Mason/Compilation.pm#L105 – Nemo

+1

それはtie()の場合に違いを生むことができますが、私はここには何も見ません。ダニー。私はこれをすることを決して考えていないだろう。 –

答えて

3
を使用するのに十分ではありません

通常のハッシュを使用して値を削除し、再度挿入すると同じ位置に変更するのと同じ結果が得られます。

commitが彼のコピーメイソン1からの機能しかし、あなたはHTML::Mason::Lexerのソースを見れば、あなたはこのコメントを見つけるだけのことを、彼はそれを削除する理由についての情報を与えるものではありません:

我々が必要としますコンポーネントをuntaintすると、正規表現はPerlのバグに で失敗します。 既存のスカラーを変更するだけでなく、全く新しいスカラーを作成する必要があるため、削除が重要です。

($current->{comp_source}) = (delete $current->{comp_source}) =~ /(.*)/s if taint_is_on; 

彼は汚染を取り除くある他の場所のためのことを行っていないが、だから、それをやっての理由は、この方法は、新しいスカラーを持つことです:Mason::Interpので、私の推測では、以前のPerlのバグです、失うとき。

したがって、deleteとの違いは新しいスカラーを与えることですが、実際にはほとんど適用されません。 (削除、挿入はもちろんのも遅い操作です。)

use strict; 
my $hash->{test} = 'test'; 
print \($hash->{test}),"\n"; 
($hash->{test}) = (($hash->{test}) =~ /(.*)/s); 
print \($hash->{test}),"\n"; 
($hash->{test}) = ((delete $hash->{test}) =~ /(.*)/s); 
print \($hash->{test}),"\n"; 

は、私はあなたに同意

SCALAR(0x7f84d10047e8) 
SCALAR(0x7f84d10047e8) 
SCALAR(0x7f84d1029230) 
関連する問題