for(@a1=`cat file`;$a[0]=shift @a1;@a1) { for(@a2=@b;$a[1]=shift @a2;@a2) # could be "for(;$a[1]=shift @b;@b)" if you don't care about emptying @b { for(@a3=grep /4/, @c;$a[2]=shift @a3;@a3) { ; } } } #### sub with {for (@{$_[1]}){$_[0] = $_;$_[2]();}} sub in { \@_ } sub run(&) { $_[0] } #### # parenthesis mandatory after in, bad idea after with and the commas can't be ommited with $a[0], in(qw/Bonjour Bonsoir/), run { with $a[1], in ("Paul", "Jack", "Lord Voldemort"), run { say "@a"; }; # semi-colon mandatory }; # same here #### Bonjour Paul Bonjour Jack Bonjour Lord Voldemort Bonsoir Paul Bonsoir Jack Bonsoir Lord Voldemort