(edit) TL; DR: il mio problema è che ho anche se le definisce API Win32 erano vere interi costanti (come nelle intestazioni di Platform SDK), mentre l'involucro Win32 Perl li definisce subs. Così ha causato l'incomprensione dell'analisi one-liner.(4 + sub) non è uguale a (sub + 4)?
Durante la prova in un one-liner una chiamata a Win32::MsgBox
, io sono perplesso dal seguente: dare che i possibili argomenti per MsgBox
sono il messaggio, una somma di bandiere di scegliere il tipo di pulsanti (valore 0 ..5) e finestra di messaggio icona "costanti" (MB_ICONSTOP
, ...) e il titolo
chiamando perl -MWin32 -e"Win32::MsgBox world, 4+MB_ICONQUESTION, hello"
dà il risultato atteso
wh ile il codice simile cercando perl -MWin32 -e"Win32::MsgBox world, MB_ICONQUESTION+4, hello"
è sbagliato
ho però che deriva dalla mia mancanza di parentesi, ma l'aggiunta di qualche perl -MWin32 -e"Win32::MsgBox (world, MB_ICONQUESTION+4, hello)"
dà esattamente lo stesso risultato sbagliato.
Ho provato con un collega scavare più a fondo e visualizzare i parametri che vengono passati ad una chiamata di funzione (i MB_xxx
costanti sono effettivamente sub) con il seguente codice
>perl -Mstrict -w -e"sub T{print $/,'called T(#'.join(',',@_).'#)'; 42 }; print $/,'results:', join ' ,', T(1), T+1, 1+T"
che emette
called T(#1#)
called T(##)
called T(#1,43#)
results:42 ,42
ma non riesco a capire il motivo per cui nella lista passata a join()
args T+1, 1+T
vengono verificati come T(1, 43)
...
Il downvote su questa domanda è chiaramente sbagliato. Questa è una domanda valida su subroutine alquanto confusa e sulla precedenza degli operatori. – TLP
È interessante che tu chiami "MB_ICONQUESTION" una costante, ma poi sperimenta le subroutine. Il titolo della tua domanda dovrebbe indicare subroutine, non costanti. – TLP
@TLP: il mio collega monaco mi ha indicato che "MB_ICONQUESTION" era in realtà un sotto (in quanto le costanti di solito sono sottose in perl), quindi abbiamo provato il test successivo. cambierò anche il titolo – Seki