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

时间:2015-07-31 21:09:59

标签: arrays perl ternary

最初,我的代码看起来像这样:

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;
}

动态添加到字符串。

3 个答案:

答案 0 :(得分:7)

这样做:

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'}} : ();

另一件事:你的标题是“有条件地实例化一个新的Perl数组”,而我们正在做的是有条件地填充它。当你说my @departments时,它会被实例化。

答案 1 :(得分:4)

如果条件失败,则@departments被设置为空数组。

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

答案 2 :(得分:2)

我会用

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

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

与明确检查if或者'?'并没有什么不同。运算符,如上面的答案,但我发现它更清晰,更少分散注意力,特别是因为它只有一行。

另外考虑:

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

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

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