The right hand side of s/// does not execute code unless you use the "e" modifier.
Would you bet your money on that statement? I would not.
You are right, s/// usually does not execute code without the /e modifier. But Perl would not be Perl if you could not mess around with that. Note that even if you could mess with perl, you probably should not.
I'll abuse a trick invented by Andrew Pimlott, that I saw first in the "Perl hardware store" talks (1, 2, 3, 4) by Dominus:
#!/usr/bin/perl
use strict;
use warnings;
sub TIEHASH
{
return bless {},$_[0];
}
sub FETCH
{
return $_[1];
}
tie my %X,__PACKAGE__;
my $foo='look! no eval: 3735928559';
$foo=~s/(\d+)/$X{sprintf '0x%08X',$1}/;
print $foo;
>perl eval.pl
look! no eval: 0xDEADBEEF
>
But there is also a way without tie magic. Dereferencing an anonymous array reference:
#!/usr/bin/perl
use strict;
use warnings;
my $foo='look! no eval: 3735928559';
$foo=~s/(\d+)/${[sprintf '0x%08X',$1]}[0]/;
print $foo;
>perl eval2.pl
look! no eval: 0xDEADBEEF
>
Both tricks (ab)use the fact that s/// interpolates the replacement expression, unless you force it not to do so (using ' as the delimiter instead of /).
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
|