Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Using SprintF in S & R

by herveus (Prior)
on Jul 11, 2017 at 18:06 UTC ( [id://1194850]=note: print w/replies, xml ) Need Help??


in reply to Using SprintF in S & R

Howdy!

The right hand side of s/// does not execute code unless you use the "e" modifier.

So, s/\<time\>(\d+)\<\/time\>/\<time\>sprintf("%06d",$1)\<\/time\>/e is what you want. Note the "e" after the last slash.

Edit to correct placement of "e" modifier. Thanks Laurent. Too many slashes and backslashes!

yours,
Michael

Replies are listed 'Best First'.
Re^2: Using SprintF in S & R
by afoken (Chancellor) on Jul 11, 2017 at 20:37 UTC
    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". ;-)
Re^2: Using SprintF in S & R
by Laurent_R (Canon) on Jul 11, 2017 at 19:00 UTC
    I guess you mean to have the "e" modifier at the end of the substitution, not after the regex of the statement modifier (the if conditional).

    Besides, I don't think you need to escape the < and > characters.

      Howdy!

      Ack! Thanks for pointing that out. The perils of too much copy and paste.

      yours,
      Michael

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1194850]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2024-04-19 10:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found