我在某些来源中看到了这行代码
( $self->{arg} ) = ( ( delete $self->{arg} ) =~ /(.*)/s ) if ${^TAINT};
Run Code Online (Sandbox Code Playgroud)
我理解无意义.我也知道删除
我的问题是,在什么情况下使用它是必要的或者是优选的delete
,并且使用更简单的东西是不够的
( $self->{arg} ) = ( ( $self->{arg} ) =~ /(.*)/s ) if ${^TAINT};
Run Code Online (Sandbox Code Playgroud)
例如
#!/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;
Run Code Online (Sandbox Code Playgroud)
使用普通哈希删除该值并重新插入将得到与就地修改它相同的结果。
该提交没有提供任何有关他删除它的原因的信息,只是他从 Mason 1 复制了功能。但是如果您查看HTML::Mason::Lexer的源代码,您会发现以下评论:
我们需要清除组件的污点,否则正则表达式将因 Perl 错误而失败。删除很重要,因为我们需要创建一个全新的标量,而不仅仅是修改现有的标量。
($current->{comp_source}) = (delete $current->{comp_source}) =~ /(.*)/s if taint_is_on;
Run Code Online (Sandbox Code Playgroud)
所以这样做的原因是有一个新的标量,尽管他没有对他未污染的其他地方这样做:Mason::Interp,所以我的猜测是在未污染时出现了早期的 Perl bug。
所以区别在于 withdelete
会给你一个新的标量,尽管这很少有实际应用。(当然,删除和插入也是一个较慢的操作。)
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";
Run Code Online (Sandbox Code Playgroud)
给出
SCALAR(0x7f84d10047e8)
SCALAR(0x7f84d10047e8)
SCALAR(0x7f84d1029230)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
165 次 |
最近记录: |