我要声明一个像这样的数组:
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在这样的数组声明中死亡?
答案 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;