在子例程中从文件句柄引用读取

时间:2018-07-23 16:47:45

标签: perl reference subroutine filehandle

我想将对文件句柄的引用传递给子例程,以便可以从文件读取子句中的代码,并且在调用环境中文件句柄中的位置发生变化,就像在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))
{

似乎可以解决问题。我仍然对为什么第一种方法行不通感兴趣。

1 个答案:

答案 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>) ...