我称其为“坏形式”,因为它根本没有必要。您不需要在 Perl 中进行布尔转换。因此,往好了说,它是多余的,往坏了说,它是一种混淆。
虽然 Perl 中有一些非常好的技巧,但该语言的最大问题之一(至少在感知上)是它很容易“编写一次”代码。
毕竟,当您可以测试标量时,为什么需要对标量进行“双重否定”才能获得布尔值呢?
my $state = !! 'some_string';
if ( $state ) { print "It was true\n" };
Or:
if ( 'some_string' ) { print "It was true\n" };
这是真的——借助“秘密”运算符、基于标点符号的变量等,你可以编写一些极其难以理解的 Perl 代码。而且它会工作得很好——例如——我仍然认为这是一部杰作:3-D立体图,自复制源 http://www.perlmonks.org/?node_id=118799
但这不是“好代码”。对于“现实世界”的使用,您的代码需要清晰、易懂且易于排除故障。
关于替代方案;
while (my $line = <$F>) {
# snip
exists $counts{lines} and $counts{lines} += !! chomp $line;
}
这是...计算您成功的频率chomp
我想是写了一行吗?所以基本上它只是计算输入中的行数。
为此,我会想“使用$.
'。除非我错过了关于你的代码的一些深刻的东西?
“如果不咀嚼怎么办?”
好吧,好吧。怎么样:
$counts{lines}++ if foo();
为了这:
sub foo {
my ($input) = @_;
my %responses = ( "" => "False", 1 => "True" );
return $responses{ !! $input };
}
我会把它写成:
sub foo {
my ($input) = @_;
return $input ? "True" : "False";
}
对于最后一个条件 - 将标志打包到一个字节中:
sub flags {
my @boolean_flags = @_;
my $flags = 0;
for ( @boolean_flags ) {
$flags<<=1;
$flags++ if $_;
}
return $flags;
}
print flags ( 1, 1, 1 );
或者也许如果你正在做类似的事情 - 借鉴如何Fcntl http://perldoc.perl.org/Fcntl.html通过定义要根据位置添加的值来实现这一点,因此您不必担心位置参数问题:
您可以通过使用标签来请求提供flock()常量(LOCK_SH、LOCK_EX、LOCK_NB和LOCK_UN):flock
.
然后你可以:
flock ( $fh, LOCK_EX | LOCK_NB );
它们是按位定义的,因此它们通过or
运算符 - 但这意味着它是幂等操作,其中设置LOCK_NB
两次就不会了。
例如,
LOCK_UN = 8
LOCK_NB = 4
LOCK_EX = 2
LOCK_SH = 1
如果我们将问题扩展到不太主观的问题:
我正在询问避免的原因!
- Perl 评估变量的“真实性”,因此实际上并不需要实际的逻辑布尔值。
- 条件语句比其等效的布尔代数更清晰。
if ( $somecondition ) { $result++ }
比$result += !! $somecondition
.
- 它在秘密操作员名单上because这很晦涩。您未来的维护程序员可能不会意识到这一点。
-
!!1
is 1
, !!0
is dualvar('', 0)
。虽然这非常灵活,但它可能会令人惊讶,特别是因为大多数人甚至不知道 Dualvar 是什么,更不用说!
返回一。如果您使用三元,那么您将得到明确的值:$value ? 1 : 0