在列表上下文中分配哈希值有什么区别?

What is a difference while assigning hash in list context?

提问人:Eugen Konkov 提问时间:11/27/2020 最后编辑:Artjom B.Eugen Konkov 更新时间:11/29/2020 访问量:71

问:

我必须表达:

%MON =    months => 1, end_of_month => 'limit';      # months => undef
%MON =  ( months => 1, end_of_month => 'limit' );

为什么第一个表达式只产生一个带值的键? 它们之间有什么区别?monthsundef

符优先级 赋值运算符 perl-hash

评论


答:

5赞 Quentin 11/27/2020 #1

请参见 perlop。 具有高于==>

%MON =    months => 1, end_of_month => 'limit'; 

等同于:

(%MON = "months"), 1, "end_of_month", "limit"

而:

%MON =  ( months => 1, end_of_month => 'limit' );

是:

%MON = ("months", 1, "end_of_month", "limit")
2赞 Dave Cross 11/27/2020 #2

下面是 Perl 的运算符优先级表(来自 perlop):

left        terms and list operators (leftward)
left        ->
nonassoc    ++ --
right       **
right       ! ~ \ and unary + and -
left        =~ !~
left        * / % x
left        + - .
left        << >>
nonassoc    named unary operators
nonassoc    < > <= >= lt gt le ge
nonassoc    == != <=> eq ne cmp ~~
left        &
left        | ^
left        &&
left        || //
nonassoc    ..  ...
right       ?:
right       = += -= *= etc.
left        , =>
nonassoc    list operators (rightward)
right       not
left        and
left        or xor

请注意,其优先级高于 或 。因此,您需要括号来覆盖优先级。=,=>

评论

0赞 Eugen Konkov 11/28/2020
在上下文中使用时,优先级应该较低吗?=void
2赞 ikegami 11/28/2020
@Eugen Konkov 中,在确定哪个运算符是哪个操作数之前,无法确定运算符的上下文。在确定结果片段的上下文之前,必须进行解析。例如,in 是在 void 上下文中计算的,但 in in 是在标量上下文中计算的,您只知道优先级。还有一个问题是,函数和返回表达式的最后一个语句的上下文直到运行时才知道,因此它不可能影响代码的编译方式。=A = B && C; 1=A = B and C; 1