perl - Why does ${fh} behave differentially than $fh when reading line by line? -
this script:
#!/usr/bin/perl use strict; use warnings; ${fh}; open($fh, '<', "some_file.txt") or die "fail\n"; while(my $line = <${fh}> ) { print $line; } close $fh; outputs:
glob(0x5bcc2a0) why output?
if change <${fh}> <$fh>, print some_file.txt line line expected. thought braces used delimit variable names, , my ${var} same my $var.
are there other scenarios adding {} around variable name causes problems?
i tried on perl 5.8.8 on red hat , cygwin perl 5.14.
from section on <> in perlop:
if angle brackets contain simple scalar variable (for example,
$foo), variable contains name of filehandle input from, or typeglob, or reference same. example:$fh = \*stdin; $line = <$fh>;if what's within angle brackets neither filehandle nor simple scalar variable containing filehandle name, typeglob, or typeglob reference, interpreted filename pattern globbed, , either list of filenames or next filename in list returned, depending on context. distinction determined on syntactic grounds alone. means
<$x>readline()indirect handle,<$hash{key}>glob(). that's because$xsimple scalar variable,$hash{key}not--it's hash element.<$x >(note space) treatedglob("$x "), notreadline($x).
you can see b::concise:
$ perl -mo=concise -e'<$fh>' 5 <@> leave[1 ref] vkp/refc ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v:{ ->3 4 <1> readline[t1] vk*/1 ->5 - <1> ex-rv2sv sk/1 ->4 3 <$> gvsv(*fh) s ->4 -e syntax ok $ perl -mo=concise -e'<${fh}>' 6 <@> leave[1 ref] vkp/refc ->(end) 1 <0> enter ->2 2 <;> nextstate(main 70 -e:1) v:{ ->3 5 <@> glob[t1] vk/1 ->6 - <0> ex-pushmark s ->3 - <1> ex-rv2sv sk/1 ->4 3 <$> gvsv(*fh) s ->4 4 <$> gv(*_gen_0) s ->5 -e syntax ok
Comments
Post a Comment