(編輯)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