On 2004-05-04, at 11:13:38 -0400, [EMAIL PROTECTED] wrote:
> Here's an example of a recurrent annoyance:
>
> my $package = 'Foo::Bar::Baz';
> (my $package_filename = $package) =~ s,::,/,g;
> require $package_filename;
> $package->foobar();
>
> One of my many neurotic little peeves is that, unless code readability
> absolutely demands it, I hate defining variables that will be used
> only once, such as $package_filename above. I would like to be able
> to do something like
>
> my $package = 'Foo::Bar::Baz';
> require TRANSFORM[ s,::,/,g, "$package.pm" ];
> $package->foobar();
>
> where TRANSFORM[] stands for an expression in which an "s-expression"
> (i.e. one using s///) is applied to a string, and the resulting string
> is returned as the result.
>
> Of course, I could define a helper sub to do this:
>
> sub transform {
> my $s_expression = shift;
> local $_ = shift;
> eval $s_expression;
> die $@ if $@;
> $_
> }
>
> But is there a way to achieve this result without defining such a
> helper sub?
Something like
[EMAIL PROTECTED] ~ $ cat /tmp/xxx.pl
my $package = 'Data::Dumper';
require do { my $_="$package.pm"; s,::,/,g; $_ };
print $package->Dump([$package]);
[EMAIL PROTECTED] ~ $ bleadperl /tmp/xxx.pl
$VAR1 = 'Data::Dumper';
?
Ok, it uses $_, but only scoped, and $_ is there anyway.
(You may s/my \$_/local \$_/ for backwards compatibility.)
Marcus
> kynn
>
> P.S. I couldn't come up with a sufficiently general transform sub such
> that its first argument is a qr-quoted regexp. Is there a way to do
> this that approaches the level of generality of the eval kluge above?
>
--
BOFH Excuse #189:
SCSI's too wide.