in reply to Re: typeglob: $var = *x ???
in thread typeglob: $var = *x ???

Thanks. So, I have to dereference the variable I assigned the typeglob to in order to turn it back into a typeglob? For instance,

$val = *x; print "@{ *{ $val } }";

Based on the output here:

print $val; --output:-- *main::x

...it's not obvious that $val needs dereferencing.

All three also work if $var = \*x;.

But I did $var = *x, which is not the same:

$what = *x; print $what, "\n"; $what = \*x; print $what, "\n"; *main::x GLOB(0x10082ad88)

It seems like in the first case, I wouldn't have to dereference $what into a typeglob, where I would expect to do so in the second case.

Also, why can I do this:

$fh = *STDOUT; print $fh 'hello', "\n"; --output:-- hello

...and not this:

$STDOUT = 10; $fh = *STDOUT; print ($fh + 2); --output:-- 2

Replies are listed 'Best First'.
Re^3: typeglob: $var = *x ???
by ikegami (Patriarch) on Jun 16, 2011 at 02:34 UTC

    But I did $var = *x

    So did I. I said \*x also works.

    it's not obvious that $val needs dereferencing.

    I showed that it doesn't need dereferencing.

    $gv = *x; @$gv => @x

    Of course, one needs to use the sigil to access the components of the glob.

    $gv = *x; $gv{ARRAY} # Obviously wrong. *$gv{ARRAY} # Ok

    ...and not this:

    Do you really want print($count + 2) to use $count as a file handle?

    print(STDOUT + 2) => print( { STDOUT } 2 )

    Barewords will be handled as expected, but anything else followed by what could be an infix operator will be treated as an argument to that operator.

    print(*STDOUT + 2) => print( { select() } *STDOUT+2 ) print(*$x + 2) => print( { select() } *$x+2 ) print($x + 2) => print( { select() } $x+2 )
      I showed that it doesn't need dereferencing.
      $gv = *x; @$gv => @x
      perlreftut says that the syntax @$gv is a shortcut for @{$gv}, and that looks like the very definition of dereferencing to me (see perlreftut, Use Rule 1). As far as I can tell, the only time you don't have to dereference the variable is when you use it as a filehandle--in that case it appears that perl uses the context to determine that it should extract the filehandle part of the typeglob.

        that looks like the very definition of dereferencing to me

        I thought you meant $gv vs *$gv

        it's not obvious that $val needs dereferencing.

        Completely false.

        "@foo" returns the list of elements in the array. "$foo" does not.

        According to you, (A) and (B) and (C) should be the same?

        A: @m = $x; B: @m = @$x; C: @m = $$x;

        The only thing that may not be obvious is that globs can be "dereferenced" instead of having to do *$gv{ARRAY}.

        As far as I can tell, the only time you don't have to dereference the variable is when you use it as a filehandle

        Both the "@" and "print" operators accept a scalar containing a glob. The first peeks into the ARRAY slot. The latter peeks into the IO slot. Both "dereference" the glob.