Devel::Cover将对哈希的访问视为false
我的一个模块因为一个//用法导致覆盖率显示为99.999%,我正在努力理解。为了简化起见,考虑这个程序:
sub scalar_rhs
{
my $a;
my $b = 1;
$a // $b
}
sub hash_rhs
{
my $a;
my %b = ( x => 1 );
$a // $b{x}
}
die 'scalar failed' unless &scalar_rhs;
die 'hash failed' unless &hash_rhs;
运行:
perl -MDevel::Cover test.pl
cover -report text
生成:
line err % l !l&&r !l&&!r expr
----- --- ------ ------ ------ ------ ----
6 *** 33 0 1 0 $a // $b
15 *** 33 0 0 1 $a // $b{'x'}
为什么 $b{x} 在Devel::Cover中被视为false?我该如何让它通过,成为 !l&&r?
解决方案
为什么Devel::Cover会把
$b{x}视为false?
因为Devel::Cover存在一个漏洞。只有在它是子程序中的最后一个表达式,或是作为 return 的操作数时,才会发生。
如何让它通过,成为
!l&&r?
通过让 // 不是子程序的最后一个操作来实现。
如果你现在想返回 $a 或 $b{x}:
{ $a // $b{x} } # Or {; $a // $b{x} }
if ( 1 ) { $a // $b{x} }
do { $a // $b{x} }
my $rv = $a // $b{x}
如果你只关心它是true还是false:
!!( $a // $b{x} )
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。