On Fri, Apr 05, 2002 at 12:17:27AM +0300, Ilmari Karonen wrote:
> 
> > I must say however, that requiring that the array is passed as a 
> > reference seems an oddity to me. If you pass it a list, it should,
> > IMO, return the shuffled list.
> 
> The point of taking a reference is that the Fisher-Yates algorithm is an
> in-place shuffle.  If your array happens to be a couple of megabytes in
> size, you start to appreciate this feature.  So, since we have this nice
> in-place shuffle algorithm, which is just as simple and effective as any
> non-in-place alternative could ever be, it seems silly to start making
> copies of arrays just to satisfy Perl's return-by-value semantics.

Ah, well, one could give the same argument for sort and map, but
noone seems to object to them not performing in situ operations.

The advantages of taking a list as argument are there too:

    my @shuffled = shuffle 1 .. 10;

reads better than:

    shuffle \my @shuffled = 1 .. 10;

or

    my @shuffled = 1 .. 10;
    shuffle \@shuffled;

> In any case, if you want to shuffle a copy of an array, you can -- just
> make the copy before shuffling it.  Sure, it's a little extra work, but
> it's no worse than what you have to do with s///.  Turning an in-place
> shuffle into copy-and-shuffle is easy, the other way is impossible.

Impossible? I wonder how people manage to sort arrays then....

    @array = shuffle @array;   # Tada!


Abigail

Reply via email to