...Any suggestions besides installing the module...
You don't need to install a module because Digest::SHA is a core perl module.
$ perl -E 'use Digest::SHA "sha256_hex"; say sha256_hex("foobar")'
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
$ perl -E 'use Digest::SHA "sha256_hex"; say sha256_hex("foobar\n")'
aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f
Anyway, maybe you are asking for advice about shelling out to programs more than advice about calculating SHA digests. You didn't do a very good job at reducing your code to the simplest example, but when I take your code and replace the for loop with $EMAIL_LIST = '"130000000640","foobar"' it works just fine (assuming you are fine with the SHA256 sum including the newline character, which seems pretty wrong to me). So, if your program is broken it is probably something else causing the problem, not the part where you shell out to openssl.
Here are other random points of advice that apply to what I see here:
- Do not parse CSV by hand. use Text::CSV for that. Your code is not obeying quote characters and could split a field that contains a comma. You code is also leaving the quote characters attached when passing the email to the shell, which just happens to work because the shell strips off the quote characters before writing it to openssl. Parsing CSV correctly is fiddly enough that you should not try to implement it from scratch.
- If you need precise control over what is written to an external command, use IPC::Run, or if you have an aversion to non-core modules, use IPC::Open3.
- If one of your email addresses on input is "foo@$(rm -rf /).com" it will destroy your server. Please consider all the security implications of shelling out with user data.
- If you really really just want to write user data into a shell command, the only way to semi-safely do it is with a module like ShellQuote::Any. You have no control over what actual shell is being used on someone's system, so escaping things for the shell is a best-guess effort, and using un-trusted external input is still a recipe for disaster.
- As always, use strict; use warnings; to help you catch problems (or now days use v5.36;) and I recommend Data::Printer to diagnose the contents of your variables, because it can help show newlines and whitespace that you won't see with plain-old "print" statements.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.