首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除或不删除具有祝福的散列成员。

删除或不删除具有祝福的散列成员。
EN

Stack Overflow用户
提问于 2015-11-15 09:47:19
回答 1查看 178关注 0票数 12

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

代码语言:javascript
复制
( $self->{arg} ) = ( ( delete $self->{arg} ) =~ /(.*)/s ) if ${^TAINT}; 

我能理解这件事。我也知道删除

我的问题是,在什么情况下使用delete是必要的或首选的,使用简单的还不够吗?

代码语言:javascript
复制
( $self->{arg} ) = ( ( $self->{arg} ) =~ /(.*)/s ) if ${^TAINT};

例如

代码语言:javascript
复制
#!/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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-07 23:02:48

使用正常的散列,删除值和重新插入将产生与适当修改它相同的结果。

提交没有提供任何关于他为什么删除它的信息,只是因为他从Mason 1中复制了该功能。但是,如果您查看HTML::Mason::Lexer的源代码,您会发现以下评论:

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

代码语言:javascript
复制
($current->{comp_source}) = (delete $current->{comp_source}) =~ /(.*)/s if taint_is_on;

因此,这样做的原因是为了有一个新的标量,虽然他没有这样做的另一个地方,他是没有污染:梅森::Interp,所以我猜是一个早期的Perl错误,当没有污染。

因此,与delete不同的是,它将给您提供一个新的标量,尽管这很少有实际的应用。(当然,删除和插入也是一种较慢的操作。)

代码语言:javascript
复制
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";

给出

代码语言:javascript
复制
SCALAR(0x7f84d10047e8)
SCALAR(0x7f84d10047e8)
SCALAR(0x7f84d1029230)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33718328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档