in reply to Getting the next array element while still keeping the current one

Interesting problem. Here is something...

#!/usr/local/bin/perl use warnings; use strict; init( [ qw/2 3 5 polka dot bikini/ ] ); my $index = 3; # 'polka' my ($current , $next , $prev ) = get($index); printf "%s\n%s\n%s\n" , $current , $next , $prev; { my ($old , $cursor , $size , @array); sub init { my $a_ref = shift; @array = @{$a_ref}; $size = scalar @array or die "empty array\n"; $cursor = 0; } sub get { $cursor = shift; $old = $cursor++; return ( current() , next_() , prev() ); } sub current { return $array[$old]; } sub prev { return ($old -1) >= 0 ? $array[ $old -1 ] : undef; } sub next_ { return ($old +1) < $size ? $array[ $old +1 ] : undef; } }

From the looks of it, it seems something like it would already have been in existence on CPAN. Anyway ...

Mind that one can easily ignore some/all of the return values; above is just one way of the using the-code-that-wants-to-be-a-module. Needless to say that current(), next_(), and prev() can be called directly as desired.

UPDATE: Return of references to prev() and next_() is changed to the return of values they would have actually returned.

Replies are listed 'Best First'.
Re: Re: Getting the next array element while still keeping the current one
by parv (Parson) on May 02, 2004 at 02:45 UTC

    Well here is another update. I did not like expanding the array on initializtion; code below has some other clarifications and enough changes to warrant another reply.

    #!/usr/local/bin/perl use warnings; use strict; my @in = qw/2 3 5 polka dot bikini/; # Help the helper code help us init( \@in ); foreach (0 .. scalar @in -1) { printf " Current: %s\n Next: %s\nPrevious: %s\n" , map { defined $_ ? $_ : 'undefined' } # # Let something else fetch the values (in forward direction o +nly) get( $_ ) # # Do it yourself #sub { move_fore(); ( current() , next_() , prev() ); }->() ; print "\n"; } # Helper code { my ($old , $cursor , $size , $array); sub init { $array = shift; $size = scalar @{$array} or die "empty array\n"; $old = $cursor = 0; } sub get { $cursor = shift; die "no index given\n" unless defined $cursor; move_fore(); return ( current() , next_() , prev() ); } sub current { return $array->[$old]; } sub prev { return ($old -1) >= 0 ? $array->[ $old -1 ] : undef; } sub next_ { return ($old +1) < $size ? $array->[ $old +1 ] : undef; } sub move_fore { $old = $cursor++; } sub move_back { $old = --$cursor; } }