Stringy eval has its uses. Moose and Moo use it extensively for creating fast inlined accessors and constructors. Template-Toolkit uses it to create templates.
However it can also enable all sorts of ugly practices. For example, poor man's symbolic references...
use strict;
my $red = '#ff0000';
my $green = '#00ff00';
my $blue = '#0000ff';
my $colour = 'green';
my $hex = eval "\$$colour"; # symbolic reference
print "$hex\n";
When many newcomers turn to stringy eval, it's often because they're unaware of a better solution to their problem.
This is my problem with Perl::Critic. It takes a generally good guideline (stringy eval is often a bad idea; investigate other options first) and turns it into a concrete rule.
Yes, of course there's no critic comments but I don't really want to litter those around my code like rat droppings. (no strict and no warnings are already enough of an eyesore.)
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
|