http://www.perlmonks.org?node_id=991896

mrider has asked for the wisdom of the Perl Monks concerning the following question:

Monks,

My last question turned out to be a basic RTFM, but this one has me truly stymied. I seek your wisdom...

Before I start, I know there is inherent danger in what I am asking. So hear me out before you flame me. As you could probably guess from my previous question, I'm creating a custom dialog in Windows. That dialog will drive a number of reports based on report name. Two widgets are disabled for certain users based on an XML configuration file. The schema of the XML is such that it's possible to describe behavior of the widget even if it is not enabled. However, trying to alter the behavior of the disabled widget causes issues in my program.

I've already worked out a way to avoid problems, but the conditional clause is pretty ugly. Basically I take in a name from the XML, and compare the name to the two known problem widgets. If it's neither name, I pass through. If it's one or the other name, and the widget with that name is enabled, I pass through. If the widget is disabled, I jump out. The condition looks something like this:

# Check if this is a problem widget, and if it is, is it visible if( ($widget_name ne "problem1" && $widget_name ne "problem2") || ($widget_name eq "problem1" && $problem1->IsVisible()) || ($widget_name eq "problem2" && $problem2->IsVisible()) ) { ... }

What would be much cleaner would be if I could get a reference to the original widget scalar based on the scalar's name. Something akin to getting a reference to a routine using my $ref = \&{'mysub'}; . I could then dereference the original widget scalar based on name and check if it's visible. Something along the lines of:

#Get reference to widget based on name then check if it's visible my $ref = \${$widget_name}; if($$ref->IsVisible()) { ... }

And before you object, the XML schema is such that the XML will be invalid if some wag puts in Robert'); DROP TABLE STUDENTS; -- or similar. Only actual valid widget names will work, otherwise the XML is invalid.

So is such a thing possible? Or is there some obvious other path that I'm too inexperienced to see?