有条件地实例化一个新的 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
.
时它被实例化
最初,我的代码如下所示:
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
.