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