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) Jesus! Thanks! Especially with the newline chomp thing. That was pretty retarded but I would have never noticed. ;) I really didn't need a count function there at all (as I learned from searching the web today that $flac_count = $#music_list). I keep trying to implement the fisher_yates_shuffle and I keep getting the error "Can't use string "/mnt/phoenix/sound/high_quality/" as an ARRAY ref while "strict refs" in use at projects/flacme line 101 so I take use strict out and get ... Modification of a non-creatable array value attempted, subscript -1 at projects/flacme line 104 Welp, this time I'll c&p the script in here ####Begin Script ;) #!/usr/bin/perl ############################################################### # Begin Modules ############################################################### use warnings; use strict; # We must for stability use File::Find; # Needed for searching / portability use Getopt::Std; # For shell switches ############################################################### # Begin Global Variables ############################################################### my @music_list = (); my @root = qw "/mnt/phoenix/sound/high_quality/albums /mnt/phoenix/sound/high_quality/individuals"; my %opt; my $flac = "flac -s -c -d"; #temporary until .flacme is implemented my $ver = "0.0.0a"; my $flac_count = 0; ############################################################### # Begin Signal Handlers ############################################################### $SIG{'INT'} = \&terminate; ############################################################### # Begin Body of the Script ############################################################### &usage(); &find_flac(); print `clear`; &version(); &shuffle(@music_list); &play(); &terminate(); ############################################################### # Begin Subroutines ############################################################### # subroutine terminate: built for expandability :) sub terminate { exit(0); } # basic version information sub version { print "\n\tflacme is copyrighted under the GNU General Public License"; print "\n\tfor more information on this license read http://www.gnu.org/ "; print "\n\tflacme-$ver\n\n\n"; } # Purely evil and ugly find code (kept to the minimum for reading purposes) sub find_flac { find (\&wanted, @root); } sub wanted { if ( /\.(flac)$/ ) { push (@music_list, "$File::Find::dir/$_") } } sub random { my $music_phile = $_[rand @_]; $flac_count = $#music_list; } sub play { for (;;) { my $music_phile = shift(@music_list); # $my $music_phile = &shuffle(@music_list); print "$flac_count playing randomly...\n\n$music_phile"; system "$flac \"$music_phile\" | rawplay"; print `clear`; } } sub usage { getopts('hv', \%opt); if ($opt{v}) { &version; &terminate; &showopts; }; if ($opt{h}) { &showopts }; } sub showopts { print "\nUSAGE: flacme [-vh]\n\n"; print "OPTIONS:\n\n"; print " -h\t\t\t\tthis help screen\n"; print " -v\t\t\t\tprint version\n"; &version; &terminate; } sub shuffle { my $music_shuffle = shift; my $i; for ( $i = @$music_shuffle; --$i; ) { my $j = int rand ($i+1); @$music_shuffle[$i,$j] = @$music_shuffle[$j,$i]; } } -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]