我想将对文件句柄的引用传递给子例程,以便可以从文件读取子句中的代码,并且在调用环境中文件句柄中的位置发生变化,就像在C中使用指针一样
这种事情:
open my $fh, '<', $somefile or die;
dosomething(\$fh);
sub dosomething
{
my $fh_ref = shift;
while (my $l = <$$fh_ref>)
{
print $l;
print "\n";
}
}
这将提供此输出,而不是写每行:
GLOB(0x20b8b38)
很显然我引用的文件句柄引用错误。
附录:
while (my $l = readline($$fh_ref))
{
等
似乎可以解决问题。我仍然对为什么第一种方法行不通感兴趣。
答案 0 :(得分:4)
菱形运算符<...>
在Perl中具有两种含义-一种对应于readline(HANDLE)
函数,另一种对应于glob(EXPR)
。 How does perl decide which function to use?
如果尖括号中的内容既不是文件句柄也不是 简单的标量变量,包含文件句柄名称,typeglob或 typeglob引用,它被解释为文件名模式为 全局文件名,或者文件名列表或 根据上下文返回列表。确定这种区别 仅基于句法依据。这意味着
<$x>
始终是readline()
来自间接句柄,但<$hash{key}>
始终是glob()
。那是 因为$x
是一个简单的标量变量,但是$hash{key}
不是-它是一个 哈希元素。即使<$x >
(请注意多余的空格)也被视为glob("$x ")
,而不是readline($x)
。
解决方法是使用显式readline
调用
while (my $l = readline($$fh_ref)) ...
或在方括号内使用更简单的表达式。
my $fh42 = $$fh_ref;
while (my $l = <$fh42>) ...