Iterators: Difference between revisions

Undo revision 331670 by Hkdtam (talk)
(added Perl programming solution)
(Undo revision 331670 by Hkdtam (talk))
Tag: Undo
Line 486:
Saturday, Wednesday, Tuesday
Purple, Yellow, Orange
</pre>
 
=={{header|Perl}}==
<syntaxhighlight lang="perl" line># 20221013 Perl programming solution
 
use strict;
use warnings;
 
sub printArrayForward ($@) {
my ($aref,@needles) = @_;
my $pointer = 0;
while ( defined ( my $needle = shift @needles )) {
while ( $needle > $pointer and defined $aref->[$pointer] ) { ++$pointer }
print "$aref->[$pointer++] " if $pointer == $needle;
}
}
 
sub printArrayBackward ($@) {
my ($aref,@needles) = @_ ;
my ($pointer, $end) = (0, -1);
while ( defined $aref->[++$pointer] ) { };
while ( defined ( my $needle = shift @needles )) {
while ( $needle < $end ) { --$end and --$pointer }
print "$aref->[$pointer-1] " if $end == $needle;
last unless defined $aref->[$pointer-1]
}
}
 
sub printLListForward ($@) {
my ($llref,@needles) = @_;
my $pointer = 0;
while ( defined ( my $needle = shift @needles )) {
while ( $needle > $pointer and defined $llref->[1] ) {
++$pointer and $llref = $llref->[1]
}
print "$llref->[0] " if $pointer == $needle;
++$pointer and $llref = $llref->[1];
}
}
 
sub printLListBackward ($@) {
my ($llref,@needles) = @_;
my ($end, @stack) = -1;
while ( defined $llref->[1] ) {
unshift @stack, $llref->[0] and $llref = $llref->[1]
}
while ( defined ( my $needle = shift @needles )) {
while ( $needle < $end ) { --$end and shift @stack }
print shift @stack , " " and --$end
}
}
 
my @dow = qw <Sunday Monday Tuesday Wednesday Thursday Friday Saturday>;
my @color = qw <red orange yellow green blue purple>;
 
my $LList = [ undef ];
foreach ( reverse @color ) { $LList = [ $_ , $LList ] }
my $copy = $LList;
 
print "All elements:\n";
for ( @dow ) { print "$_ " }
print "\n";
while ( defined $copy->[1] ) { print "$copy->[0] " and $copy = $copy->[1] }
 
print "\n\nFirst, fourth, and fifth elements:\n";
printArrayForward \@dow, (0,3,4);
print "\n";
printLListForward $LList, (0,3,4);
 
print "\n\nReverse first, fourth, and fifth elements:\n";
printArrayBackward \@dow, (-1,-4,-5);
print "\n";
printLListBackward $LList, (-1,-4,-5);
print "\n";</syntaxhighlight>{{out}}
<pre>All elements:
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
red orange yellow green blue purple
 
First, fourth, and fifth elements:
Sunday Wednesday Thursday
red green blue
 
Reverse first, fourth, and fifth elements:
Saturday Wednesday Tuesday
purple yellow orange
</pre>
 
350

edits