in reply to Re^3: 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

WNOHNAG is defined in:

use POSIX qw(:sys_wait_h); WNOHANG is a constant value. There is no "&" address of this constant value defined.

Perhaps I should have said no & address of (&) operator is needed before a constant. And that it is wrong to do that.

Updated with strikes.

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

Replies are listed 'Best First'.
Re^5: Using IO::CaptureOutput in a child process to caputre STDOUT and STDERR
by Anonymous Monk on Apr 10, 2011 at 23:18 UTC
    There is no "&" address of this constant value defined.

    Um, in perl, & is not the address-of operator

    $ perl -MPOSIX=WNOHANG -e "print WNOHANG, &WNOHANG" 11
      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.

        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
        &WNOHANG is a deprecated syntax, but still works.

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

        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 :)