试图理解困难的Perl语法:数组和空方括号

Sag*_*ner 2 arrays perl

我试图分析一段包含以下内容的Perl代码:

unless( @{$avl->Rates() || []} ) {
  if(!$nobar) { push @rptmp, 'BAR' unless @rptmp; }
}
Run Code Online (Sandbox Code Playgroud)

我觉得我理解的内心动作.这意味着"如果$ nobar为false(在这种情况下为0),则将字符串'BAR'添加到数组中,@rptmp除非@rptmp已经存在."

我遇到麻烦的部分是第一个"除非"条件:unless ( @{$avl->Rates() || []} ).$avl->Rates()是一个返回列表的函数(或者可能是指向列表的指针?).但对我来说真正令人困惑的部分是|| [].这是"或"某事,因此除非不$avl->Rates()返回任何内容,否则不会选中它.但我不确定它是做什么的,特别是空方括号.如果它返回一些空的东西,它不会总是错误吗?还有,有更好的,或者至少更清晰的方式来写这个吗?

ike*_*ami 5

所以除非不$avl->Rates()返回,否则不会选中它

它不可能在标量上下文中返回任何内容.据推测,它返回对数组的引用或undef.unless (@{ $avl->Rates })在后一种情况下会失败,因此编码器决定在这种情况下使用对空数组的引用.

[]
Run Code Online (Sandbox Code Playgroud)

大致相当于

# Create an array, and return a reference to it.
do { my @anon; \@anon }
Run Code Online (Sandbox Code Playgroud)

这有点浪费,但是

if (!@{ $avl->Rates() || [] }) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

通常使用,因为它短于

my $rates = $avl->Rates();
if (!$rates || !@$rates) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

以下内容更清晰,避免Rates在不需要时调用:

if (!$nobar && !@rptmp) {
   my $rates = $avl->Rates;
   push @rptmp, 'BAR'
      if !$rates || !@$rates;
}
Run Code Online (Sandbox Code Playgroud)