Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
Hello monks,

Foreword During lasts weeks seems I was very active in producing oneliners (so much that I'm tempted to write some tutorial about some useful teqniques).

In one oneliner where i was fixed for a parametrizable solution i come across the -s perl's switch, that i admit I was completely unaware of.

In perlrun few lines are dedicated to it. It is somtehing difficult to search informantions for, but I found:

From what i understand from official docs it works on the shebang line: it must also run from command line for oneliners and other programs too.

Let's see what I tested given simple.pl program as follow:

# use strict; # UPDATE: that was commented as spotted by Eily +( see below) # use warnings; # UPDATE BEGIN{print "inside BEGIN \@ARGV is [@ARGV]\n"} my $test='original value'; print "inside main \@ARGV is [@ARGV] and \$test is [$test] +\n";

perl -s simple.pl -test=SET_VIA_-s arg1 inside BEGIN @ARGV is [arg1] and $test is [SET_VIA_-s] inside main @ARGV is [arg1] and $test is [original value]

Ie $test is set by the commandline switch -test=SET_VIA_-s and is visible in the BEGIN then the body of the program gives it another value original value Why this does not deparse to anything visible (as opposite of other switches like -l -n -p -a -F )?

perl -MO=Deparse -s simple.pl -test=SET_VIA_-s arg1 inside BEGIN @ARGV is [arg1] and $test is [SET_VIA_-s] sub BEGIN { print "inside BEGIN \@ARGV is [@ARGV] and \$test is [$test]\n"; } my $test = 'original value'; print "inside main \@ARGV is [@ARGV] and \$test is [$test]\n"; simple.pl syntax OK

while in the oneliner version (without strict and warnings)

perl -se "BEGIN{print qq(inside BEGIN \@ARGV is [@ARGV]\n)};print + qq(inside main \@ARGV is [@ARGV] and \$test is [$test]\n);" -test=SET_VIA_-s arg1 inside BEGIN @ARGV is [arg1] Can't modify constant item in scalar assignment at -e line 2, near + "SET_VIA_-s" syntax error at -e line 2, near "SET_VIA_-s" Execution of -e aborted due to compilation errors.
And using the -- termintation of switch processing it works fine:
perl -se "BEGIN{print qq(inside BEGIN \@ARGV is [@ARGV]\n)};print + qq(inside main \@ARGV is [@ARGV] and \$test is [$test]\n);" -- -test=SET_VIA_-s arg1 inside BEGIN @ARGV is [arg1] inside main @ARGV is [arg1] and $test is [SET_VIA_-s]

But adding strict and warnigs and the my declaration for $test (as in simple.pl ) the oneliners version gives different results:

perl -se "use strict; use warnings;BEGIN{print qq(inside BEGIN \@ +ARGV is [@ARGV]\n)}my $test='originalvalue';print qq(inside main \@ +ARGV is [@ARGV] and \$test is [$test]\n);" -- -test=SET_VIA_-s arg1 inside BEGIN @ARGV is [arg1] inside main @ARGV is [arg1] and $test is [original value]

In addition the evil behaviour explained in the above mentioned thread is still active, and evem more incomprensible if you add a qq(..)

perl -se "'A'=~/(A)/;print $1 " -- -1=OUCH! OUCH! perl -se "'A'=~/(A)/;print qq($1\n)" -- -1=OUCH! A

personal conclusions about -s switch

  • cannot works with scripts that use strict and warnings because cannot ovveride vars declared with my
  • works only with oneliners pushing global vars in the namespace
  • still has evil and not coherent behaviours

It is said in perlrun that enables rudimentary switches. It is not too reductive word?. Is not worth to spend some word more in the official docs, explaining that MUST be used only in oneliners to act as rudimentary switch's processor (only oneliners examples, not short script)? Are my conclusions correct? Cannot be that switch a candidate to be removed? Why it's usage does not deparse to something visible? what the hell in the last example?

L*

There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

In reply to about perl -s switch -- usable? evil? unneeded? by Discipulus

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (4)
As of 2024-04-24 22:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found