in reply to Internally, how do for() and while() differ?
As others already said, no. Here's what the compiler backend B (B::Terse) says, running
perl -MO=Terse -le 'for(<>){print}' perl -MO=Terse -le 'while(<>){print}'
substituting the addresses with 0x? and running 'vimdiff for while':
==================== for ====================|=================== while ===================
LISTOP (0x?) leave [1] | LISTOP (0x?) leave [1]
OP (0x?) enter | OP (0x?) enter
COP (0x?) nextstate | COP (0x?) nextstate
BINOP (0x?) leaveloop | BINOP (0x?) leaveloop
LOOP (0x?) enteriter | LOOP (0x?) enterloop
OP (0x?) null [3] | ---------------------------------------------
UNOP (0x?) null [147] | ---------------------------------------------
OP (0x?) pushmark | ---------------------------------------------
UNOP (0x?) readline [2] | ---------------------------------------------
PADOP (0x?) gv GV (0x?) *ARGV | ---------------------------------------------
PADOP (0x?) gv GV (0x?) *_ | ---------------------------------------------
UNOP (0x?) null | UNOP (0x?) null
LOGOP (0x?) and | LOGOP (0x?) and
OP (0x?) iter | UNOP (0x?) defined
---------------------------------------------| UNOP (0x?) null
---------------------------------------------| UNOP (0x?) null [15]
---------------------------------------------| PADOP (0x?) gvsv GV (0x?) *_
---------------------------------------------| UNOP (0x?) readline [2]
---------------------------------------------| PADOP (0x?) gv GV (0x?) *ARGV
LISTOP (0x?) lineseq | LISTOP (0x?) lineseq
COP (0x?) nextstate | COP (0x?) nextstate
LISTOP (0x?) print | LISTOP (0x?) print
OP (0x?) pushmark | OP (0x?) pushmark
UNOP (0x?) null [15] | UNOP (0x?) null [15]
PADOP (0x?) gvsv GV (0x?) *_ | PADOP (0x?) gvsv GV (0x?) *_
OP (0x?) unstack | OP (0x?) unstack
which shows,that for gobbles up all lines (LOOP enteriter) to process each (OP iter) after that, whereas the while loop (LOOP enterloop) processes readline and print in the loop body (LOOP enterloop).
|
|---|