Fogle Cpl Shawn B wrote: > > 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;
You have the terminate sub defined below. Why not just define the whole thing here? $SIG{'INT'} = sub { exit 0 }; > ############################################################### > # Begin Body of the Script > ############################################################### > > &usage(); > &find_flac(); > print `clear`; > &version(); > &shuffle(@music_list); > &play(); > &terminate(); You should call subroutines without the ampersand unless you really this different functionality. usage(); find_flac(); print `clear`; version(); shuffle(@music_list); play(); terminate(); > ############################################################### > # Begin Subroutines > ############################################################### > > # subroutine terminate: built for expandability :) > sub terminate { exit(0); } Perl will inline this if you define a prototype with no arguments. 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/$_") } ^ ^ You have parentheses there but you are not using them for anything. push @music_list, $File::Find::name if /\.flac$/; > } > > sub random { my $music_phile = $_[rand @_]; > $flac_count = $#music_list; > } I can't see where this is used at all or what you are trying to use it for. > 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; }; ^^^^^^^^^^^^^^^^^^^^^ terminate() exits the program so showopts() never gets called. > 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]; > } > } It looks like you are just using subs for the sake of using subs. I would probably write it like this: #!/usr/bin/perl 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 $flac = 'flac -s -c -d'; #temporary until .flacme is implemented my $ver = '0.0.0a'; my $usage = <<USAGE; USAGE: flacme [-vh] OPTIONS: -h\t\t\t\tthis help screen -v\t\t\t\tprint version USAGE my $version = <<VERSION; \tflacme is copyrighted under the GNU General Public License \tfor more information on this license read http://www.gnu.org/ \tflacme-$ver VERSION ############################################################### # Begin Subroutines ############################################################### sub terminate () { exit 0 }; $SIG{'INT'} = \&terminate; sub find_flac { find( sub { /\.flac$/ and push @music_list, $File::Find::name }, @_ ) } ############################################################### # Begin Body of the Script ############################################################### my %opt; getopts( 'hv', \%opt ); if ( exists $opt{'v'} ) { print $version; terminate; } if ( exists $opt{'h'} ) { print $usage, $version; terminate; } find_flac( @root ); system 'clear'; print $version; # Fisher-Yates shuffle my $i = @music_list; while ( $i-- ) { my $j = int rand ( $i + 1 ); @music_list[ $i, $j ] = @music_list[ $j, $i ]; } my $flac_count = 0; while ( @music_list ) { my $music_phile = shift @music_list; # $my $music_phile = &shuffle(@music_list); print "$flac_count playing randomly...\n\n$music_phile"; system qq($flac "$music_phile" | rawplay); system 'clear'; } terminate; __END__ John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]