From e92ce056f2022a3f96487b1b5a1862a3bf9c159c Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Sun, 25 Apr 2021 09:20:51 +0000 Subject: Implement n-at-a-time for loops. For example, this now works: for my ($key, $value) (%hash) { ... } Only for scalars declared with my as a list in the for loop statement. As many as you want (unless you want more than 4294967296). --- perly.y | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'perly.y') diff --git a/perly.y b/perly.y index 18ed6e8fc9..2e2935c60e 100644 --- a/perly.y +++ b/perly.y @@ -91,7 +91,7 @@ %type listexpr nexpr texpr iexpr mexpr mnexpr %type optlistexpr optexpr optrepl indirob listop method %type formname subname proto cont my_scalar my_var -%type refgen_topic formblock +%type list_of_scalars my_list_of_scalars refgen_topic formblock %type subattrlist myattrlist myattrterm myterm %type termbinop termunop anonymous termdo %type termrelop relopchain termeqop eqopchain @@ -426,6 +426,11 @@ barestmt: PLUGSTMT $$ = block_end($remember, newFOROP(0, $my_scalar, $mexpr, $mblock, $cont)); parser->copline = (line_t)$FOR; } + | FOR MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont + { + $$ = block_end($remember, newFOROP(0, $my_list_of_scalars, $mexpr, $mblock, $cont)); + parser->copline = (line_t)$FOR; + } | FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont { $$ = block_end($remember, newFOROP(0, @@ -1377,6 +1382,20 @@ my_scalar: scalar { parser->in_my = 0; $$ = my($scalar); } ; +/* A list of scalars for "for my ($foo, $bar) (@baz)" */ +list_of_scalars: list_of_scalars[list] PERLY_COMMA + { parser->in_my = 0; $$ = $list; } + | list_of_scalars[list] PERLY_COMMA scalar + { + $$ = op_append_elem(OP_LIST, $list, $scalar); + } + | scalar %prec PREC_LOW + ; + +my_list_of_scalars: list_of_scalars + { parser->in_my = 0; $$ = $list_of_scalars; } + ; + my_var : scalar | ary | hsh -- cgit v1.2.1