(编辑)TL; DR:我的问题是,我虽然在Win32 API定义是真实的整数常量(如平台SDK头),而在Win32 Perl的包装将它们定义为潜艇。从而导致了单线解析被误解。给人对于MsgBox
可能的参数是消息,标志之和来选择那种按钮(值0:(4 + sub)不等于(sub + 4)?
虽然在一个班轮测试,以Win32::MsgBox
一个电话,我对下面的困惑..5)和消息框图标 “常数”(MB_ICONSTOP
,...)和标题
调用perl -MWin32 -e"Win32::MsgBox world, 4+MB_ICONQUESTION, hello"
给出了预期的结果
WH ILE在寻找类似的代码perl -MWin32 -e"Win32::MsgBox world, MB_ICONQUESTION+4, hello"
是错误的
我第一次,虽然它来自我缺乏括号,但增加了一些perl -MWin32 -e"Win32::MsgBox (world, MB_ICONQUESTION+4, hello)"
给完全相同的错误的结果。
我与同事试图更深入和显示传递给函数调用(作为MB_xxx
常量实际上潜艇)用下面的代码
>perl -Mstrict -w -e"sub T{print $/,'called T(#'.join(',',@_).'#)'; 42 }; print $/,'results:', join ' ,', T(1), T+1, 1+T"
输出
called T(#1#)
called T(##)
called T(#1,43#)
results:42 ,42
参数
但我不明白为什么在列表传递给join()
的参数T+1, 1+T
被解析为T(1, 43)
...
对这个问题的看法显然是错误的。这是一个有关混淆子程序和运算符优先级的有效问题。 – TLP
有趣的是,你调用'MB_ICONQUESTION'是一个常量,然后用子例程进行实验。你的问题的标题应该指出子程序,而不是常量。 – TLP
@TLP:我的和尚同事指出,'MB_ICONQUESTION'实际上是一个子(因为常量通常是perl中的subs),所以我们尝试了后面的测试。我将更改标题 – Seki