Devel::Cover将对哈希的访问视为false

编程语言 2026-07-09

我的一个模块因为一个//用法导致覆盖率显示为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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章