有条件地实例化一个新的 Perl 数组

Conditionally instantiate a new Perl array

最初,我的代码如下所示:

my @departments = @{$opts->{'d'}} if $opts->{'d'};

我想根据Perl Best Practices重构行内if语句,所以现在我得到了以下代码:

my @departments;
if( $opts->{'d'} )
{
    @departments = @{$opts->{'d'} };
}

$opts 只是一个哈希引用,它可能有一个数组引用作为键的值。

我想做类似下面的事情来使代码保持在一行上:

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : undef;

但很明显,这只会将一个元素放入 @departments 中,值为 undef

我以这种方式执行此操作的原因是因为我以后希望能够检查

if( @departments )
{
    my $department_string = join( q{,}, @departments );
    $big_string . $department_string;
}

动态添加到字符串。

如果条件失败,这会导致 @departments 被设置为空数组。

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : ();

我会用

my @departments = @{ $opts->{d}||[] };

如果 $opts->{d} 不存在,则不成立,因此 perl 会查找 '||' 的右侧并找到空的 arrayref,然后将其转换为空列表。

这与使用 if 或 '?' 显式检查并没有什么不同运算符,如上面的答案,但我发现阅读代码更清晰,更不会分散注意力,尤其是因为它只有一行。

换种方式考虑:

$opts->{d} ||= [];
my @departments = @{$opts->{d}};

那会先设置一个空的 arrayref,然后转换为数组,基本上会做同样的事情(除非你想重复转换成一个数组,那么这个方法可以避免你重复输入 || []) .

我希望这会有所帮助,我已经看到我经常建议的用于转换数组/散列引用 (my %hash = %{ $hash||{} };) 的符号,但不确定它是否已被设置。

这样做:

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : undef;

相同
my @departments = $opts->{'d'} ? @{$opts->{'d'}} : (undef);

如果 $opts->{d} 为 false,则会将单个元素 undef 分配给数组 @departments。您不想要包含单个元素的数组。你想要一个空数组。

因此,您要做的是将一个空列表分配给 @departments,如下所示:

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : ();

另一件事:您的标题说 "conditionally instantiate a new Perl array",实际上我们正在做的是有条件地填写它。当你说 my @departments.

时它被实例化