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

s_d*_*lan 2 arrays perl ternary

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

my @departments = @{$opts->{'d'}} if $opts->{'d'};
Run Code Online (Sandbox Code Playgroud)

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

my @departments;
if( $opts->{'d'} )
{
    @departments = @{$opts->{'d'} };
}
Run Code Online (Sandbox Code Playgroud)

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

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

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : undef;
Run Code Online (Sandbox Code Playgroud)

但显然,这只会使一个元素@departments具有价值undef.

我以这种方式执行此操作的原因是因为我后来想要检查

if( @departments )
{
    my $department_string = join( q{,}, @departments );
    $big_string . $department_string;
}
Run Code Online (Sandbox Code Playgroud)

动态添加到字符串.

And*_*ter 7

这样做:

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : undef;
Run Code Online (Sandbox Code Playgroud)

是相同的

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : (undef);
Run Code Online (Sandbox Code Playgroud)

if $opts->{d}为false将为undef数组分配单个元素@departments.您不希望包含单个元素的数组.你想要一个空数组.

所以,你想要做的是分配一个空列表@departments,如下所示:

my @departments = $opts->{'d'} ? @{$opts->{'d'}} : ();
Run Code Online (Sandbox Code Playgroud)

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