Perl入門   No.24


6.5 超簡易データベース
 
住所録を作ってみましょう。住所録の1レコードの属性は、
氏名
住所
電話番号
 
の3つです。
 
データを登録
 
address.pl というプログラム名
address.dat にCSV形式で保存されます。
 
address.pl
#!/usr/bin/perl

 # address.pl  For my address
 # サブルーチンを使って、1つのプログラムで登録、修正、検索を行う

print "Select mode(登録(T),修正(B),検索(S)): ";
$select = <STDIN>;
chop $select;

if($select eq 'T'){
  &touroku;
}
if($select eq 'B'){
  &syuusei;
}
if($select eq 'S'){
  &search;
}

# データを登録するサブルーチン

sub touroku{

 # 登録は複数登録出来るようにトグルにする。
while(<>){
   print "name : ";
  $name = <STDIN>;
  chop $name;
  if($name eq ""){
    die "終了します\n";
    exit;
   }

   print "address : ";
   $address = <STDIN>;
   chop $address;

   print "TEL : ";
   $tel = <STDIN>;
   chop $tel;

  # 登録データをaddress.dat に書き込む。追加書き込みであることに注意
  open(OUT,">>address.dat");
  print OUT "\"$name\",\"$address\",\"$tel\"\n";
  close(OUT);
  }
}

# データを修正(名前をキー項目。住所、電話番号をそれぞれ修正)

sub syuusei{
while(<>){
   print "name : ";
  $s_name = <STDIN>;
      chop $s_name;
  if($s_name eq ""){
     die "終了します\n";
     exit;
  }

   print "address : ";
    $s_address = <STDIN>;
    chop $s_address;

   print "TEL : ";
    $s_tel = <STDIN>;
     chop $s_tel;

  open(OUT,"address.dat");
  while(<OUT>){
     if(/\"(.*)\",\"(.*)\",\"(.*)\"/){
      $name = $1;
      $address = $2;
      $tel = $3;
     }

     if($name eq $s_name){
        if($s_address ne ""){
           $address = $s_address;
         }
        if($s_tel ne ""){
           $tel = $s_tel;
         }
     }
    # 修正箇所を含んだ全データを一旦tmp ファイルに書き込む
    open(IN,">>add_temp.dat");
    print IN "\"$name\",\"$address\",\"$tel\"\n";
    close(IN);
   }
   close(OUT);

    # tmp ファイルをaddress.dat にする
   unlink "address.dat";
   rename "add_temp.dat","address.dat";
  }
}

データを検索

sub search{
  print "Search fields (name,address,tel) : ";
  $field = <STDIN>;
  chop $field;

  print "Search word : ";
  $word = <STDIN>;
  chop $word;

  open(OUT,"address.dat");
  while(<OUT>){
     if(/\"(.*)\",\"(.*)\",\"(.*)\"/){
       $name = $1;
       $address = $2;
       $tel = $3;

# $field には、文字列としてname,address,telが入っているので、
# 検索用のfield変数($koumoku)に実際のファイル項目を入れる

     if($field eq "name"){
       $field_1 = $name;
     }
     if($field eq "address"){
       $field_1 = $address;
     }
     if($field eq "tel"){
       $field_1 = $tel;
     }
    }

   if($field_1 =~ /$word/ ){
     print "$name\n";
     print "$address\n";
     print "$tel\n";
   }
  }
close(OUT);
}
 
 
注:このプログラムは必要最低限の機能しか書いていません。該当データがなかった場合、「該当データはありません」とか、「修正されました」とかのメッセージを出力したり、検索結果出力フィールドを指定したりとか出来るように拡張してみてください。