cbIterator { goto STOP if $_ >700; print; } \@nested; STOP: #### #! perl -slw use strict; use Data::Dump qw[ pp ]; sub genNested { my $n = shift; map{ rand() < 0.5 ? [ rand(1000), genNested( $n-1 ) ] : rand( 1000 ) } 1 .. $n; } sub cbIterator (&$) { my( $code, $tree ) = @_; for my $i ( 0 .. $#$tree ) { if( ref( $tree->[ $i ] ) eq 'ARRAY' ) { &cbIterator( $code, $tree->[ $i ] ); } else { local $_ = $tree->[ $i ]; $code->(); } } } my @nested = genNested( 3 ); pp \@nested; my $count=0; cbIterator { goto STOP if $_ >700; $count++; print; } \@nested; STOP: print "stopped after $count iterations"; __END__ [ 477.675948149653, [ 127.346865922796, [497.437228434123, 201.338051626486], 374.088657613129, ], [ 767.071185158308, [597.589516628219, 84.8516920524318], [541.772816445729, 983.763599841957], ], ] 477.675948149653 127.346865922796 497.437228434123 201.338051626486 374.088657613129 stopped after 5 iterations