【问题标题】:Why "?:" operator cannot return list?为什么“?:”运算符不能返回列表?
【发布时间】:2017-10-26 12:43:19
【问题描述】:

为什么?:操作符不能返回列表?

my $hash =  {
    ...
    ($row->active?checked=>1:()),
};

DOC 对标量或列表上下文只字不提

UPD
另一个例子:

@list =  2,3;         # CORRECT
@list =  1? 2,3 : (); # Syntax error

为什么第一个可以,第二个不行?似乎 perl 将2,3 传播到外部上下文应该没有问题;

【问题讨论】:

  • 您是否遇到了某种错误? checked=>1 到底应该是什么?这不是我认可的价值。
  • @hymie: 1. 我收到语法错误。 2.checked => 1是名单:'checked',1
  • @list = 2,3; 可能是正确的语法,但是您是否检查了结果列表实际包含的内容?
  • checked=>1 不是一个列表。 (checked => 1) 是一个哈希值。括号是语法的一部分,不是可以忽略的选项。
  • @hymie: ( checked => 1 ) 不是哈希:它是两个值的列表。

标签: perl perlop


【解决方案1】:

问题在于,=>(列表分隔符)的优先级低于?:=

因此,perl 是否将= 的右侧作为列表或标量传递,这不是问题。这是一个语法错误,因为 @list=1?23:() 被作为列表的单独项目处理,每个项目都包含一半的 ?: 语句,这是不允许的。

【讨论】:

    【解决方案2】:

    这与上下文无关。您需要在中间部分加上括号,以便 Perl 正确解析您的语法。

    my $hash = { ( 1 ? ( checked => 1 ) : () ), };
    

    没有这些,就会出现语法错误。

    /home/simbabque/code/scratch/scratch.pl 第 109 行,“checked =>”附近的语法错误

    【讨论】:

    • 我知道如何解决这个问题。问题是为什么 perl 不能通过 checked => 1 到外部上下文。好像是对的
    • @EugenKonkov “这似乎是正确的” 它不是。 perl 有一个语法规范,希望您遵守。
    • hymie:我以为只有 perl 6 有语法规范……请指点一下 perl 5 的规范?
    • @EugenKonkov 当然 -- perldoc perldata
    • @hymie: 三元算子什么都没有
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多