在最近的工作面试过程中,我提交了一些使用所谓的“秘密”的示例Perl代码!
operator.后来,在讨论代码时,一位采访者问我为什么选择使用它,并表示它被认为是不好的形式。他没有详细说明为什么。
我的团队和我一直使用这个运算符多年,没有意识到它被认为是“坏的形式”。
“bang bang”操作符有副作用或其他意外行为吗?为什么,或者可能,被认为是“坏形式”的一些?有没有惯用的替代方法?
下面是几个例子,我会考虑!可接受和/或期望。
while (my $line = <$F>) { # snip exists $counts{lines} and $counts{lines} += !! chomp $line; }
>使用布尔值作为哈希键(清楚地简化示例):
sub foo { my ($input) = @_; my %responses = ( '' => "False",1 => "True" ); return $responses{ !! $input }; }
>在按位操作中使用布尔值,或者甚至使用pack():
sub foo { my ( $a,$b,$c ) = @_; my $result = !!$a + (!! $b)<<1 + (!! $c)<<2; return $result; }
>你需要做一个类型转换,以供外部库/进程使用,例如数据库,它只认为某些值是真实的:
my $sth = $dbh->prepare("INSERT INTO table (flag,value) VALUES (?,?)") $sth->execute("i_haz_cheeseburger",!! $cheeseburger_string)
解决方法
你的 !!利用了Perl中的两个晦涩的东西:具体的值!返回,并且可能的值之一是dualvar(包含字符串和数字的标量)。使用!复合这些行为是诚实的。虽然它的pithiness可以是一个巨大的加分,它也可以是一个相当大的减号。不要使用导致项目强制“在此项目上禁止使用Perl”的功能。
有很多的选择$ count = !! (some_expression)来计算该表达式的真值的出现。一个是三元,$ count =(some_expression)? 1:0。这也有点模糊。有一个很好的紧凑的方式来做你想要的,这是使用post-if:
$x++ if some_expression;
这正是你在做什么。