Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Linux file handle not working

by pvfki (Novice)
on Jan 16, 2020 at 00:46 UTC ( #11111465=perlquestion: print w/replies, xml ) Need Help??

pvfki has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I am trying to run a perl command through linux console using filehandle ($_ sign) in order to indicate a file to use when running the command. The commands from the code snippet below are from https://metacpan.org/pod/ntheory

For example, I have the following number in input.txt: 147416345806550029415781910597841 Running with Windows:
>perl -Mntheory=:all -nE "chomp; say is_prime($_);" input.txt 1 >perl -Mntheory=:all -nE "chomp; say length($_);" input.txt 33
Running on Linux however I get:
>perl -Mntheory=:all -nE "chomp; say is_prime($_);" input.txt Parameter 'inputtxt' must be a positive integer at -e line 1, <> line +1. >perl -Mntheory=:all -nE "chomp; say length($_);" input.txt Parameter 'inputtxt' must be a positive integer at -e line 1, <> line +1.
Does anyone know how to fix this? I'm not sure how perl (shell) via Linux works? How do I get the same output as Windows? Thanks for help!

Replies are listed 'Best First'.
Re: Linux file handle not working
by shmem (Chancellor) on Jan 16, 2020 at 01:36 UTC

    The shell quoting rules are different between Windows and Linux/UNIX. Within double quotes (") the $ sign is significant to the Linux/UNIX shell. Try:

    >perl -Mntheory=:all -nE 'chomp; say is_prime($_);' input.txt

    The argument for the -e flag is surrounded with " on Windows, but with ' on Linux/UNIX. Quoting rules therefore are different in the body of the script provided via -e, which led iirc to the q() family of operators (see perlop)

    update: the _ identifier is set in the shell to the last argument of the previous command, so $_ is set to input.txt which is interpolated into the program string passed to perl via -e as the expression of concatenation of two barewords:

    qwurx [shmem] ~> perl -E "say '$_'" foo.bar qwurx [shmem] ~> perl -E "say '$_'" foo.bar foo.bar qwurx [shmem] ~> perl -E "say $_" foo.bar foobar

    This is a dangerous thing, if the last argument of the previous line happens to contain metacharacters, e.g.

    qwurx [shmem] ~> echo '`ls -l /dev/null`' `ls -l /dev/null` qwurx [shmem] ~> perl -E "say $_" crw-rw-rw- 1 root root 1, 3 Nov 27 11:02 /dev/null qwurx [shmem] ~> perl -MO=Deparse -E "say $_" use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch' +, 'unicode_strings', 'unicode_eval'; say say(say(`ls -l /dev/null`)); -e syntax OK

    so don't do that.

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
Re: Linux file handle not working
by 1nickt (Canon) on Jan 16, 2020 at 01:33 UTC

    Hi,

    Works for me with Math::Prime::Util v.073 on MacOS with Perl 5.30.1 and on Ubuntu with Perl 5.28.1 :

    $ echo 147416345806550029415781910597841 > input.txt
    $ perl -Mstrict -Mntheory=:all -wnE 'chomp; say is_prime($_);' input.t +xt 1
    $ perl -Mstrict -Mntheory=:all -wnE 'chomp; say length($_);' input.txt 33

    Hope this helps!


    The way forward always starts with a minimal test.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11111465]
Approved by Athanasius
Front-paged by haukex
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (1)
As of 2023-06-04 04:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How often do you go to conferences?






    Results (17 votes). Check out past polls.

    Notices?