Well, I'm not only new to Perlmonks, but even newer to Lisp, as I just started to learn it. So, since a lot of different solutions have been posted, I thought I post my Common Lisp version (there's probably a better way to do it and I hope there isn't a bug):
(defun roman_to_dec (roman)
(if (not (equal roman ""))
(let ((rtoa '((#\M . 1000)
(#\D . 500)
(#\C . 100)
(#\L . 50)
(#\X . 10)
(#\V . 5)
(#\I . 1))))
(reduce #'(lambda (a b) (- (+ a b) (* (mod a b) 2)))
(map 'list
#'(lambda (c) (cdr (assoc c rtoa)))
(string-upcase roman))))))
Update: Ok, the
(if (not (equal roman ""))
could probably be removed, because no error checking is necessary regarding to the description, and it is halfhearted to boot.