Perl script to mask a credit card number

Here's the basic idea:  given a 16 digit credit card number, I want to replace the first 12 digits with x's.

Example:  1223 1223 1234 2345  would become   xxxx xxxx xxxx 2345

I'm using ActiveState Perl.


Thanks for any assistance!
LVL 2
EschbacherGAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jmcgOwnerCommented:
(my $credit_card_number_masked = $credit_card_number) =~ s/.*(\d{4})$/xxxx xxxx xxxx $1/;

This just picks off and preseres the last four digits, disregarding whatever comes before.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
EschbacherGAuthor Commented:
What if there are no spaces in the cardnumber?

like  123412324123241234?  Can i just remove your spaces from your regular expression?
ahoffmannCommented:
$credit_card_number=~s((\d{4}( ?)){3})((x x 4) x 3)e;
Exploring SharePoint 2016

Explore SharePoint 2016, the web-based, collaborative platform that integrates with Microsoft Office to provide intranets, secure document management, and collaboration so you can develop your online and offline capabilities.

jmcgOwnerCommented:
If preserving the spaces (or lack of spaces) is important, you'll have to do something more like what ahoffman is showing you. If you want the x-ed-out credit card number to look a particular way, however, you're better off using my approach.
josephfluckigerCommented:
Hope you don't mind me asking a question here, but what does the "e" at the end of the expression do?

$credit_card_number=~s((\d{4}( ?)){3})((x x 4) x 3)e; <----
jmcgOwnerCommented:
An "e" modifier on a substitution indicates that the right hand side of the substitution is to be interpreted as a perl expression rather than as a double-quoted string literal (well, nearly). You can even put extra "e"s there to get multiple levels of expression interpretation, but I've never seen this usefully done more than two levels deep.
josephfluckigerCommented:
thanks, I owe you some points :).

sorry to use your question space EschbacherG.
ahoffmannCommented:
well, my suggestion is not perfect, and to be improved in many ways (as jmcg's too:), but it answers the question
KISS - keep it stupid simple  ;-)

josephfluckiger, probably you replace
  x x 4
in my suggestion by
  X x 4
to understand what happens
  print "X" x 4
characters are just characters, and some have special meaning in special context ..
EschbacherGAuthor Commented:
Thank you both very much for your quick answers.   In the end, I went with jmcg's suggestion.
joneoytkCommented:
so what if the input from keyboard and i dont want it to show on the screen.does this command (my $credit_card_number_masked = $credit_card_number) =~ s/.*(\d{4})$/xxxx xxxx xxxx $1/;
work on my concept too?
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Perl

From novice to tech pro — start learning today.