Regardless how many times it does the raw? Maybe changing the vars to sets would do what you need? You'd need to unset afterwards, of course.

Maybe make an alias to run names:
Code:
/mynames {
  unset %ops %voices %regs
  names $1-
}


Then, change these 3 lines:
Code:
    if ($left($gettok(%data,%c,32),1) == @) { var %ops = %ops $gettok(%data,%c,32) }
    elseif ($left($gettok(%data,%c,32),1) == +) { var %voices = %voices $gettok(%data,%c,32) }
    else { var %regs = %regs $gettok(%data,%c,32) }


to:

Code:
    if ($left($gettok(%data,%c,32),1) == @) { set %ops %ops $gettok(%data,%c,32) }
    elseif ($left($gettok(%data,%c,32),1) == +) { set %voices %voices $gettok(%data,%c,32) }
    else { set %regs %regs $gettok(%data,%c,32) }