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

Re^6: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR

by Marshall (Canon)
on Apr 11, 2011 at 06:03 UTC ( [id://898661]=note: print w/replies, xml ) Need Help??


in reply to Re^5: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR
in thread Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR

My comment was not right.
See better explanation below.

&WNOHANG is a deprecated syntax, but still works.

Yes, & is Perl bitwise operator.
I consider it bad form to "AND" a constant with itself. Omit the &.

Update: As a matter of style, I would omit the & in front of WNOHANG. In 'C' that is the way that is is done. I am surprised that you can put & in front of WNOHANG, but ok it is obviously true that in Perl you can. Do as you will, I would not put that & there.

  • Comment on Re^6: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR

Replies are listed 'Best First'.
Re^7: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR
by Eliya (Vicar) on Apr 11, 2011 at 07:45 UTC

    While I agree the & isn't needed here, it's not the bitwise operator in this case. That would require two operands — to bitwise "and" something with itself you'd have to write e.g. 42 & 42.

    Rather, the & here is the subroutine sigil.  While it was required in the early days of Perl, it's optional these days, and its use is discouraged except for special purposes, such as to take a reference of a subroutine (\&foo), or to circumvent prototypes (see perlsub).

    And the latter is also the reason you shouldn't use & with constants:  constants are subroutines with an empty prototype, which makes Perl optimize the function call away. Telling Perl to circumvent the prototype is not a good idea as it prevents the optimization:

    $ perl -MO=Concise -e 'sub foo(){42}; print foo' 6 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 2 -e:1) v:{ ->3 5 <@> print vK ->6 3 <0> pushmark s ->4 4 <$> const[IV 42] s ->5 -e syntax OK $ perl -MO=Concise -e 'sub foo(){42}; print &foo' 8 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 2 -e:1) v:{ ->3 7 <@> print vK ->8 3 <0> pushmark s ->4 6 <1> entersub[t2] lK/TARG,AMPER,1 ->7 - <1> ex-list lK ->6 4 <0> pushmark s ->5 - <1> ex-rv2cv sK/8 ->- 5 <#> gv[*foo] s ->6 -e syntax OK
      The main point is that the "&" is not required. We agree that WNOHANG should be a bare word (its like that in 'C'). I do thank you for the Perl explanation!
Re^7: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR
by Anonymous Monk on Apr 15, 2011 at 20:39 UTC
    &WNOHANG is a deprecated syntax, but still works.

    Actually no, it is not a deprecated syntax as of perl v5.14.0

Re^7: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR
by Anonymous Monk on Apr 12, 2011 at 06:20 UTC
    Yes, & is Perl bitwise operator. I consider it bad form to "AND" a constant with itself. Omit the &.

    FWIW, doing/advising something without understanding the reasons is called cargo-culting.

    As Eliya eloquently explained, bad style is not the same as wrong syntax :)

Log In?
Username:
Password:

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

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

    No recent polls found