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
In reply to Re^2: Using SprintF in S & R
by afoken
in thread Using SprintF in S & R
by dirtdog
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |