Thanks for your help. This looks really good. Unfortunately I only have perl 5.12 so this fails with these errors

Type of arg 1 to keys must be hash or array (not private variable) at +./test.pl line 25, near "$value ]"
Type of arg 1 to keys must be hash or array (not private variable) at +./test.pl line 32, near "$found) "
Type of arg 1 to values must be hash or array (not private variable) a+t ./test.pl line 34, near "$found)"

Also as regards %filer_device and %filer_volume sometimes in this data structure these are not hashes, sometimes both are, and sometimes one is and the other isn't
I am really not too sure how to go about dealing with that :-(
Also regarding the %defaults section I am not allowed to hardcode that.
In the small sample of this data structure I have shown this is tied in to the tag "@dev". So any mountpoint defined under here gets those permissions.
In the rest of the data structure I have other tags like @build and @software and under each one of these they have their own set of multiple mount point definitions and their own set of default permissions that need to be set.
I ultimately need to print the strings out in the following format without hardcoding any key names in the subroutine I use to parse the data struture. All I can pass to the subroutine is the data structure and the @keylist:

When putting a smiley right before a closing parenthesis, do you:

Use two parentheses: (Like this: :) )
Use one parenthesis: (Like this: :)
Reverse direction of the smiley: (Like this: (: )
Use angle/square brackets instead of parentheses
Use C-style commenting to set the smiley off from the closing parenthesis
Make the smiley a dunce: (:>
I disapprove of emoticons
Other