On Mon, 7 Oct 2002, Fogle Cpl Shawn B wrote: > I have studied > the fisher_yates_shuffle but I can't seem to implement it to save my life. > It would help quite a bit if I understood what "@$" is and how to > effectively use it. I don't see it in the beginners manual (and haven't > searched the perldocs yet). Please feel free to diff me any improvements you > have, I'd love to see what improvements can be made (be it known I am > working on the short getopts). > > Thanks in advance > shawn
I will post the parts of your code that can be changed along with my comments. $SIG{'INT'} = 'terminate'; # This is better written as $SIG{'INT'} = \&terminate; # perldoc perlipc, look at the first page sub find_flac { foreach (@root) { find ( \&wanted, "$_" ); } } # You don't need the foreach here, the second argument to find is a list # this can be rewritten as find (\&wanted, @root) # perldoc File::Find sub wanted { if ( /\.(flac)$/ ) { push (@music_list, "$File::Find::dir/$_\n") } } # You are pushing a string with a newline only to chomp it later on, why so? # $File::Find::name contains the complete pathname to the file, you don't need # a $File::Find::dir/$_ sub random { my $music_phile = $_[rand @_]; } # The @$ is used to get to the array from the array reference that is # passed into the sub. I will explain the code as given in # perldoc -q shuffle sub fisher_yates_shuffle { my $deck = shift; # $deck is a reference to an array my $i = @$deck; # @$deck gets to the array from the reference # In scalar context this will give the number # of elements in the array. while ($i--) { my $j = int rand ($i+1); # perldoc -f rand, rand returns a value greater than or equal to 0 # and less than it's argument. In this case, greater than or equal to 0 # and less than the current index + 1. This makes sure that the indices # that have been shuffled do not get shuffled again @$deck[$i,$j] = @$deck[$j,$i]; # This is how you swap array elements in perl. Swap the value of the # current index with the one returned from rand. # This style (@$deck[$i,$j]) is called an array slice } } # You also have a choice to use the shuffle function from List::Util. # You can get this module from # http://search.cpan.org/author/GBARR/Scalar-List-Utils-1.0701/ # You can shuffle your array by including this function and calling # it as fisher_yates_shuffle (\@music_list) sub count { foreach (@music_list) { $flac_count++; }; } # @music_list used in a scalar context will give you the no of elements in that array. # You don't need the foreach loop here just a $flac_count = @music_list should do -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]