Perl 1
Part one of Perl.
strange parameter passing mechanism
#!/usr/bin/perl %mp3s = ( "1.mp3" => ["/mp3","1"], "2.mp3" => ["/mp3","3"], "3.mp3" => ["/mp3","4"], "4.mp3" => ["/mp3","5"], "5.mp3" => ["/mp3","3"], "6.mp3" => ["/mp3","2"], "7.mp3" => ["/mp3","2"], ); sub listSongs { #return number of songs while (($key,@value) = each(%mp3s)) { print $key."=>".$value[0][0].",".$value[0][1]."\n"; } } sub addSongs { #add/edit a song to/in the list #addSong(name,path,stars) @list = @_; $mp3s{$list[0]} = [$list[1],$list[2]]; } sub removeSongs { #remove a song from list #removeSongs(name) $name=$_[0]; if (exists($mp3s{$name})) { delete($mp3s{$name}); } } sub editSongs { #edit song's path and star NOT the name #editSongs(name,newPath,newStar) @list=@_; $name=$list[0]; $newPath=$list[1]; $newStar=$list[2]; addSongs($name,$newPath,$newStar); } sub searchSongs { #search for a song by name #searchSong($name) #return full detail of the song if found, nothing if else $name=@_[0]; if (exists($mp3s{$name})) { print $name." => ".$mp3s{$name}[0].", ".$mp3s{$name}[1]."\n"; } else { print "No record found!\n"; } } sub getInput { $input=<STDIN>; chop $input; return $input; } sub printMenu { print "\n################ Please choose an option ################\n"; print "1.Add a song\n"; print "2.Edit a song\n"; print "3.Remove a song\n"; print "4.Search for a song\n"; print "5.List all songs\n"; print "press 'q' to quit\n"; print "################# End of option menu #####################\n"; print "Your choice: "; } #addSongs("8.mp3","/mp3","4"); #addSongs("8.mp3","/mp3","4"); #removeSongs("7.mp3"); #editSongs("1.mp3","/mp4","5"); #listSongs; $input=""; until ($input eq "q") { printMenu; $input=<STDIN>; chop $input; use feature ":5.10"; given($input) { when ("1") { print "Name?: "; $name=getInput; print "Path?: "; $path=getInput; print "Star?: "; $star=getInput; addSongs($name,$path,$star); } when ("2") { print "Name?: "; $name=getInput; print "Path?: "; $path=getInput; print "Star?: "; $star=getInput; addSongs($name,$path,$star); } when ("3") { print "Name?: "; $name=getInput; removeSongs($name); } when ("4") { print "Name?: "; $name=getInput; searchSongs($name); } when ("5") { listSongs; } default { print "Wrong option! Choose again.\n"; } } }
Perl 2
Part 2 OO of Perl
- perl2main main file
- mp3s.pm class file
I did not turn the code into purely OO based to save time.
Databases of songs are object (blessed), but songs are not.
mp3s.pm contains the database class.
perl2main is the running file which makes use of mp3s.pm.
perl2main
#!/usr/bin/perl use mp3s; sub printSongMenu { print "\n################ Please choose an option ################\n"; print "1.Add a song\n"; print "2.Edit a song\n"; print "3.Remove a song\n"; print "4.Search for a song\n"; print "5.List all songs\n"; print "6.Restore current database\n"; print "press 'x' to go to main menu\n"; print "################# End of option menu #####################\n"; print "Your choice: "; } sub printMainMenu { print "\n################ Please choose an option ################\n"; print "1.Add a database\n"; print "2.Remove a database\n"; print "3.Enter a database\n"; print "4.List all databases\n"; print "press 'q' to quit\n"; print "################# End of option menu #####################\n"; print "Your choice: "; } sub getInput { $input=<STDIN>; chop $input; return $input; } sub addDatabase { #add a database $name=@_[0]; $a1=new mp3s(); $database{$name}=$a1; } sub listDatabase { #display all the database while (($key,@value) = each(%database)) { print $key."\n"; } } sub removeDatabase { #remove a database $name=$_[0]; if (exists($database{$name})) { delete($database{$name}); } } sub enterDatabase { #enter database, return the mp3s obj from hash #print sub menu $name=@_[0]; return $database{$name}; } $input=""; until ($input eq "q") { printMainMenu; $input=getInput; use feature ":5.10"; given($input) { when ("1") {#add database print "Database name?: "; $name=getInput; addDatabase($name); } when ("2") {#remove database print "Database to be removed?: "; $name=getInput; removeDatabase($name); } when ("3") {#enter database############################## print "Database to enter?: "; $name=getInput; $a1=enterDatabase($name); until ($subinput eq "x") { printSongMenu; $subinput=getInput; use feature ":5.10"; given($subinput) { when ("1") { print "Name?: "; $name=getInput; print "Path?: "; $path=getInput; print "Star?: "; $star=getInput; $a1->addSongs($name,$path,$star); } when ("2") { print "Name?: "; $name=getInput; print "Path?: "; $path=getInput; print "Star?: "; $star=getInput; $a1->editSongs($name,$path,$star); } when ("3") { print "Name?: "; $name=getInput; $a1->removeSongs($name); } when ("4") { print "Name?: "; $name=getInput; $a1->searchSongs($name); } when ("5") { $a1->listSongs; } when ("6") { $a1->restoreDatabase; } default { print "Wrong option! Choose again.\n"; } } } }####################################end of sub menu when ("4") {#list database listDatabase; } when ("q") {#quit the program 1; } default {#wrong option print "Wrong option! Choose again.\n"; } } }
mp3s.pm
#!/usr/bin/perl package mp3s; #database class sub new { my $self={}; %mp3s = ( "1.mp3" => ["/mp3","1"], "2.mp3" => ["/mp3","3"], "3.mp3" => ["/mp3","4"], "4.mp3" => ["/mp3","5"], "5.mp3" => ["/mp3","3"], "6.mp3" => ["/mp3","2"], "7.mp3" => ["/mp3","2"], ); bless $self; return $self; } #restore database sub restoreDatabase { $self=new mp3s(); } #lister sub listSongs { #return songs while (($key,@value) = each(%mp3s)) { print $key."=>".$value[0][0].",".$value[0][1]."\n"; } } #getter sub getSongs { #return hash %mp3s return %mp3s; } sub addSongs { #add/edit a song to/in the list #addSong(name,path,stars) $class=shift; @list = @_; $mp3s{$list[0]} = [$list[1],$list[2]]; } sub removeSongs { #remove a song from list #removeSongs(name) $class=shift; $name=$_[0]; if (exists($mp3s{$name})) { delete($mp3s{$name}); } } sub editSongs { #edit song's path and star NOT the name #editSongs(name,newPath,newStar) $class=shift; @list=@_; $name=$list[0]; $newPath=$list[1]; $newStar=$list[2]; $mp3s{$name} = [$newPath,$newStar]; } sub searchSongs { #search for a song by name #searchSong($name) #return full detail of the song if found, nothing if else $class=shift; $name=@_[0]; if (exists($mp3s{$name})) { print $name."=>".$mp3s{$name}[0].",".$mp3s{$name}[1]."\n"; } else { print "No record found!\n"; } } 1;
improvement
This is the output for assignment 1. It is quite straight forward.
################ Please choose an option ################ 1.Add a song 2.Edit a song 3.Remove a song 4.Search for a song 5.List all songs press 'q' to quit ################# End of option menu ##################### Your choice: 5 3.mp3=>/mp3,4 1.mp3=>/mp3,1 5.mp3=>/mp3,3 7.mp3=>/mp3,2 6.mp3=>/mp3,2 2.mp3=>/mp3,3 4.mp3=>/mp3,5
This is assignment 2. I added one database “db1”, then enter the database and print out the default song list. And all the songs I made in the class are there. So they do get blessed, not as the obj, but as field in the obj. And when I am in the database, I have one extra option “restore the current”, this will destroy and remake the obj with default song list.
################ Please choose an option ################ 1.Add a database 2.Remove a database 3.Enter a database 4.List all databases press 'q' to quit ################# End of option menu ##################### Your choice: 1 Database name?: db1 ################ Please choose an option ################ 1.Add a database 2.Remove a database 3.Enter a database 4.List all databases press 'q' to quit ################# End of option menu ##################### Your choice: 3 Database to enter?: db1 ################ Please choose an option ################ 1.Add a song 2.Edit a song 3.Remove a song 4.Search for a song 5.List all songs 6.Restore current database press 'x' to go to main menu ################# End of option menu ##################### Your choice: 5 3.mp3=>/mp3,4 1.mp3=>/mp3,1 5.mp3=>/mp3,3 7.mp3=>/mp3,2 6.mp3=>/mp3,2 2.mp3=>/mp3,3 4.mp3=>/mp3,5