如何使用不存在的哈希键声明数组后如何使Perl死亡

时间:2019-07-12 18:59:27

标签: perl

我要声明一个像这样的数组:

my @row = (
$discordances{$assay}{plate_pair},
$assay,
$discordances{$assay}{contigName},
$discordances{$assay}{start},
$discordances{$assay}{test_calls},
$discordances{$assay}{truth_calls}
);

但是我希望程序在我使用不存在的哈希键声明@rows时死掉

现在,我正在使用use warnings FATAL => 'all'use autodie ':all',但是都没有捕获到错误。稍后我将提供旨在捕获可能的错误的代码,但是我尝试将其保留得尽可能短,以提高可读性和易用性,因此,我不想使用该代码来捕获{{1} }应该已经被抓住了。

如何让Perl在这样的数组声明中死亡?

3 个答案:

答案 0 :(得分:3)

您可以使用核心Hash::Util来锁定键,而不必花费额外的操作对

use Hash::Util qw(lock_keys unlock_keys);

my %h = (k1 => 7); 

lock_keys %h;

my @ary = (3, $h{nokey}, $h{k1});  # dies; no problem w/o that 'nokey'

unlock_keys %h;                    # So you can modify it later

此示例中不存在nokey的情况下

Attempt to access disallowed key 'nokey' in a restricted hash at ...

因此,请记住,如果需要以后再更改它们,请在分配数组后解锁键。

请注意,您可能还需要lock_hash_recurse来锁定更深的键。参见文档。


这些可以在do块中被“吸收”

my @ary = do { 
    lock_keys %h;
    my @ary_tmp = ( 3, $h{...}, ... );
    unlock_keys %h;
    @ary_tmp;          # returned
};

为了保持整洁并确保不会忘记解锁,但是我不确定它是否有帮助,尽管它会导致额外花费数据复制和创建数组(仅被丢弃)。

答案 1 :(得分:2)

exists。那应该让您知道键下是否有某些内容,是否为undef,如

use strict;
use warnings;

my %the_hash = ( 1 => undef );

# (undef, undef)
my @arr1 = ( $the_hash{1}, $the_hash{2} );

# (undef)
my @arr2 = map { $the_hash{$_} } grep { exists $the_hash{$_} } qw(1 2);

然后您可以执行以下操作:

my @arr = map { $the_hash{$_} } grep { exists $the_hash{$_} or die 'the message' } qw(1 2);

是吗?

答案 2 :(得分:1)

这里没有警告,因为查找不存在的哈希键并获得undef作为结果,并使数组元素为undef是完全合法的。

如果您尝试将任何undef元素用作字符串或数字,则此时将收到警告。

如果这还不够好,您可以明确检查:

die "missing values" if grep ! defined, @row;