KONISHI Hiromasaです。

>  $KCODE = "sjis" => $KCODE = "e"
>  NKF::nkfの削除
>  "%\(\)! \.,&\-+" => "%\(\)! \.,&\\-\\+"
>
>上記の変更で希望通りの結果が得られました。
おめでとうございます.

コードの説明でちょっと補足を.

$KCODE = "sjis" # これ以降のコード内では、日本語はShift-JISであるとする.
NKF::nkf( "-s", st ) # 第二引数(st)をShift-JIS(第一引数の'-s'で
                     # そう指定した)に変換した文字列を与える.
です.
あと、私の環境で、文字列はShift-JISで記述したので、"A-Za-z0-9"あた
りは、Shift-JISです.
よしかずさんのところはEUCみたいなので、メールで"A-Za-z0-9"あたりを
コピーしたりすると文字コードはEUCになっていますよね.
とするとEUCで処理するコードを書かなければなりません.
違いをコードで説明すると下のようになります.

#Shift-JIS
  def zen_alpha_to_han( st )
    $KCODE = "sjis"
    NKF::nkf( "-s", st ).tr( "A-Za-z0-9", "A-Za-z0-9" ).tr( 
                              "%()! .,&─+", "%\(\)! \.,&\-+" )
    #日本語はShift-JISで記述する
  end
  
#EUC
  def zen_alpha_to_han( st )
    $KCODE = "euc"
    NKF::nkf( "-e", st ).tr( "A-Za-z0-9", "A-Za-z0-9" ).tr( 
                              "%()! .,&─+", "%\(\)! \.,&\-+" )
    #日本語はEUCで記述する
  end
  
となります.NKF::nkfの細かいパラメータについてはヘルプを参照してください.