无论有没有删除,都可以保留一个有福的哈希成员

时间:2015-11-15 09:47:20

标签: perl hash taint

我在某些来源中看到了这行代码

( $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 个答案:

答案 0 :(得分:3)

使用普通哈希删除该值并重新插入将产生与在适当位置修改它相同的结果。

commit并没有提供任何有关他为什么删除它的信息,只是他从Mason 1复制了这些功能。但如果你看一下HTML::Mason::Lexer的来源,你会发现这个评论:< / p>

  

我们需要解开组件,否则正则表达式将失败   到一个Perl bug。删除很重要,因为我们需要   创建一个全新的标量,而不仅仅是修改现有的标量。

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

所以这样做的原因是有一个新的标量,虽然他没有为他没有染色的其他地方做那个:Mason::Interp,所以我的猜测是早期的Perl bug,当没有染色时

所以区别在于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)