Perl 为什么在逐行阅读时${fh}的行为与$fh不同?

Perl 为什么在逐行阅读时${fh}的行为与$fh不同?,perl,Perl,此脚本: #!/usr/bin/perl use strict; use warnings; my ${fh}; open($fh, '<', "some_file.txt") or die "fail\n"; while(my $line = <${fh}> ) { print $line; } close $fh; 为什么这是输出 如果我将更改为,它将按预期逐行打印一些文件.txt。我认为大括号可以用来分隔变量名,my${var}将与my$var相同 在变量

此脚本:

#!/usr/bin/perl
use strict;
use warnings;

my ${fh};

open($fh, '<', "some_file.txt") or die "fail\n";

while(my $line = <${fh}> ) {
    print $line;
}
close $fh;
为什么这是输出

如果我将
更改为
,它将按预期逐行打印
一些文件.txt
。我认为大括号可以用来分隔变量名,
my${var}
将与
my$var
相同

在变量名周围添加
{}
会导致问题吗


我在Red Hat和Cygwin Perl 5.14上试用了Perl 5.8.8。

中的
部分:

如果尖括号中包含的是一个简单的标量变量(例如,
$foo
),则该变量包含要从中输入的文件句柄的名称或其typeglob,或对该文件句柄的引用。例如:

$fh = \*STDIN;
$line = <$fh>;
  • 表示
    读线(ARGV)
  • 表示
    读线(标识符)
  • 表示
    readline($IDENTIFIER)
  • (任何其他)表示
    glob(qq)
所以

  • 表示
    读线($fh)
  • 表示
    glob(qq)
    ,与
    glob($fh”)
    相同
用于从模式生成大量字符串或文件名


在这种情况下,文件句柄的字符串化是
GLOB(0x5BC2A0)
。这是传递给glob的,但是这些字符中没有一个对
glob
有特殊意义,因此
glob
只是返回该字符串。

有很多情况下,添加
{}
会更改解析,例如,
“$foobar”
“${foo}bar”
“$foo::bar”与
“$code>”相比,
“$foo's bar”
vs.
“${foo}s bar”
“$foo[0]”
vs.
“${foo}[0]”
。但我猜你是在问除了字符串插值以外的情况吗?@ThisSuitesBlack不是你猜对的。答案也很好!所以基本上
是在完全的字符级别定义的。。。哇,CS不及格@卡兹,你从哪儿弄来的?我的帖子用记号来定义它。即使它确实使用了一种子语言(比如
m//
tr//
sprintf
glob
do),我也不明白为什么这会让你的内裤打结。在另一个答案中,我注意到(引用自文档),在这个答案中,甚至
也与
@Kaz完全不同。那又怎么样?你为什么这么说?@nwellnhof,你似乎只读了我一半的句子,因为我明确地说,这不是你穿内裤的理由,因为这种事经常发生
/$x/
/$x/
不同<代码>“$x”
“$x”
不同。等
$fh = \*STDIN;
$line = <$fh>;