最初,我的代码看起来像这样:
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;
}
动态添加到字符串。
答案 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||{} };
)的符号。