Click here to get back home

FAQ 4.47 How do I handle circular lists?

 HomeNewsGroups | Search | About
 comp.lang.perl.misc    Post an article   get this group's latest topics as an RSS feed add this group's latest topics to your My MSN content add this group's latest topics to your My Yahoo content
Subject Author Date
FAQ 4.47 How do I handle circular lists? PerlFAQ Server 05-12-2008
Posted by PerlFAQ Server on May 12, 2008, 3:03 pm
Please log in for more thread options
This is an excerpt from the latest version perlfaq4.pod, which
comes with the standard Perl distribution. These postings aim to
reduce the number of repeated questions as well as allow the community
to review and update the answers. The latest version of the complete
perlfaq is at http://faq.perl.org .

--------------------------------------------------------------------

4.47: How do I handle circular lists?

Circular lists could be handled in the traditional fashion with linked
lists, or you could just do something like this with an array:

unshift(@array, pop(@array)); # the last shall be first
push(@array, shift(@array)); # and vice versa

You can also use "Tie::Cycle":

use Tie::Cycle;

tie my $cycle, 'Tie::Cycle', [ qw( FFFFFF 000000 FFFF00 ) ];

print $cycle; # FFFFFF
print $cycle; # 000000
print $cycle; # FFFF00



--------------------------------------------------------------------

The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
are not necessarily experts in every domain where Perl might show up,
so please include as much information as possible and relevant in any
corrections. The perlfaq-workers also don't have access to every
operating system or platform, so please include relevant details for
corrections to examples that do not work on particular platforms.
Working code is greatly appreciated.

If you'd like to help maintain the perlfaq, see the details in
perlfaq.pod.

Posted by sheinrich on May 13, 2008, 4:35 am
Please log in for more thread options
> --------------------------------------------------------------------
>
> 4.47: How do I handle circular lists?
>
> Circular lists could be handled in the traditional fashion with linked
> lists, or you could just do something like this with an array:
>
> unshift(@array, pop(@array)); # the last shall be first
> push(@array, shift(@array)); # and vice versa
>
>

As the modulo operator provides a simple way to address an array in a
circular fashion, which is maybe not obvious to the less experienced,
I think it should be mentioned here.

my @Colours = qw( FFFFFF 000000 FFFF00 );

my $asize = @Colours;
my $index = 0;

for (1..10) {
print $Colours[$index], "\n";

$index = ++$index % $asize;
}

# or shorter, with an ever growing $index though:

$index = 0;

for (1..10) {
print $Colours[$index++ % $asize], "\n";
}


steffen


Posted by brian d foy on May 13, 2008, 4:51 am
Please log in for more thread options
In article

> > --------------------------------------------------------------------
> >
> > 4.47: How do I handle circular lists?
> >
> > Circular lists could be handled in the traditional fashion with linked
> > lists, or you could just do something like this with an array:
> >
> > unshift(@array, pop(@array)); # the last shall be first
> > push(@array, shift(@array)); # and vice versa
> >
> >
>
> As the modulo operator provides a simple way to address an array in a
> circular fashion, which is maybe not obvious to the less experienced,
> I think it should be mentioned here.

That's a good idea. I should also mention Tie::Cycle.

I'll update the answer. Thanks. :)

Posted by szr on May 13, 2008, 9:06 am
Please log in for more thread options
brian d foy wrote:
> In article
>
>>> --------------------------------------------------------------------
>>>
>>> 4.47: How do I handle circular lists?
>>>
>>> Circular lists could be handled in the traditional fashion with
>>> linked lists, or you could just do something like this with an
>>> array:
>>>
>>> unshift(@array, pop(@array)); # the last shall be first
>>> push(@array, shift(@array)); # and vice versa
>>>
>>>
>>
>> As the modulo operator provides a simple way to address an array in a
>> circular fashion, which is maybe not obvious to the less experienced,
>> I think it should be mentioned here.
>
> That's a good idea. I should also mention Tie::Cycle.
>
> I'll update the answer. Thanks. :)

Tie::Cycle /is/ mentioned in this FAQ :-)

--
szr



Posted by John W. Krahn on May 13, 2008, 9:11 am
Please log in for more thread options
sheinrich@my-deja.com wrote:
>> --------------------------------------------------------------------
>>
>> 4.47: How do I handle circular lists?
>>
>> Circular lists could be handled in the traditional fashion with li=
nked
>> lists, or you could just do something like this with an array:
>>
>> unshift(@array, pop(@array)); # the last shall be first
>> push(@array, shift(@array)); # and vice versa
>>
>>
>=20
> As the modulo operator provides a simple way to address an array in a
> circular fashion, which is maybe not obvious to the less experienced,
> I think it should be mentioned here.
>=20
> my @Colours =3D qw( FFFFFF 000000 FFFF00 );
>=20
> my $asize =3D @Colours;
> my $index =3D 0;
>=20
> for (1..10) {
> print $Colours[$index], "\n";
>=20
> $index =3D ++$index % $asize;

perldoc perlop

[ SNIP ]

Note that just as in C, Perl doesn=92t define when the variable is
incremented or decremented. You just know it will be done sometime
before or after the value is returned. This also means that
modifying a variable twice in the same statement will lead to
undefined behaviour. Avoid statements like:

$i =3D $i ++;
print ++ $i + $i ++;

Perl will not guarantee what the result of the above statements is.


So don't do that. Do this instead:

$index =3D ( $index + 1 ) % $asize;



John
--=20
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall

Similar ThreadsPosted
FAQ 4.47 How do I handle circular lists? February 28, 2005, 12:03 pm
FAQ 4.47 How do I handle circular lists? May 17, 2005, 5:03 pm
FAQ 4.47 How do I handle circular lists? August 2, 2005, 4:03 pm
FAQ 4.47 How do I handle circular lists? October 5, 2005, 10:03 pm
FAQ 4.47 How do I handle circular lists? January 11, 2006, 5:03 pm
FAQ 4.47 How do I handle circular lists? April 20, 2006, 3:03 am
FAQ 4.47 How do I handle circular lists? August 2, 2006, 9:03 pm
FAQ 4.47 How do I handle circular lists? October 14, 2006, 9:03 pm
FAQ 4.47 How do I handle circular lists? December 26, 2006, 9:03 pm
FAQ 4.47 How do I handle circular lists? February 24, 2007, 9:03 pm

Our other projects:

Art Dolls, Fairies and Mermaids - Sunnyfaces.net

Roy's Linux, Programming and Search Engines messages

1-Script XML SitemapXML Sitemap