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