The first question that springs to mind is why you can't just
read this out of a file, the syntax of which you could define
so easily. Then there's no requirement for all the qw-stuff.
Secondly, since you can read it in from a file so easily,
you could just as easily read it in from a here document
using the same parser.
Or, if you're feeling energetic, you can "cheat"
by feeding a list to a function which returns a hash (ref?):
%p = fix qw [
cs_req => basic_cs math_req
basic_cs => intro_rec comp_org adv_prog
intro_req => intro_cs introI introII
];
Converting from this list to a hash is a quick sub that
uses map, perhaps. It's probably even Golf-able.