在删除或不删除的情况下取消对受祝福的哈希成员的绘制



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

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

我理解不加掩饰。我也知道删除

我的问题是,在什么情况下有必要或更喜欢使用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;

使用普通哈希,删除值并重新插入会得到与原地修改相同的结果。

提交没有提供任何关于他为什么删除它的信息,只是他从Mason 1复制了功能。但是如果你查看HTML::Mason::Lexer的来源,你会发现这个评论:

我们需要取消标记组件,否则正则表达式将失败到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)

相关内容

  • 没有找到相关文章

最新更新