Also, if the subroutine is called with something other than an array reference, it still returns a count of 1.
Update
This code addresses the issues above and returns the correct reference depth of the array.
sub depth { return 0 unless ref $_[0] eq 'ARRAY'; return depth( ${$_[0]}[0] ) + 1; }
Or alternatively, without recursion ...
sub depth { my $array = shift; my $count = 0; while (ref $array eq 'ARRAY') { $array = ${$array}[0]; ++$count; } return $count; }
Update
Okay ... So I was curious and went ahead and benchmarked these subroutines and was pleasantly surprised with the result.
Benchmark: timing 100000 iterations of loop, recursion... loop: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 18 +867.92/s (n=100000) recursion: 6 wallclock secs ( 5.87 usr + 0.00 sys = 5.87 CPU) @ 17 +035.78/s (n=100000)
#!/usr/bin/perl use Benchmark; use strict; timethese (100000, { 'recursion' => q! sub depth { return 0 unless ref $_[0] eq 'ARRAY'; return depth( ${$_[0]}[0] ) + 1; }; my $array = [ [ [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ] ]]; my $result = depth($array); !, 'loop' => q! sub depth { my $array = shift; my $count = 0; while (ref $array eq 'ARRAY') { $array = ${$array}[0]; ++$count; } return $count; } my $array = [ [ [ 1 ], [ 1 ] ], [ [ 1 ], [ 1 ] ]]; my $result = depth($array); ! });
In reply to Re: Depth of AoAs
by rob_au
in thread Depth of AoAs
by CharlesClarkson
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |