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



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

等等。

似乎奏效了。我仍然对为什么第一种方法不起作用感兴趣。

菱形运算符<...>在Perl中有两个含义——一个对应于readline(HANDLE)函数,另一个对应glob(EXPR)。perl如何决定使用哪个函数?

如果尖括号内的既不是文件句柄也不是包含文件句柄名称、typeglob或typeglob引用,它被解释为globbed,以及文件名列表或根据上下文返回列表。这种区别是确定的仅基于句法原因。这意味着<$x>始终是readline()来自间接句柄,但<$hash{key}>始终是glob()。那是因为$x是一个简单的标量变量,但$hash{key}不是——它是hash元素。即使<$x >(注意额外的空间(也被视为glob("$x ")而不是readline($x)

解决方法是使用显式readline调用

while (my $l = readline($$fh_ref)) ...

或者在括号内使用更简单的表达式。

my $fh42 = $$fh_ref;
while (my $l = <$fh42>) ...

最新更新