在Perl子例程中返回文件句柄
这段代码之间的区别是什么:在Perl子例程中返回文件句柄,perl,reference,scope,Perl,Reference,Scope,这段代码之间的区别是什么: sub createOutputFile { my $filepath = shift; open my $fh, '>', $filepath; return $fh; 当最后一行作为refreferencereturn\$fh返回时 我知道$fh存在于createOutputFile子例程的本地范围中,但当我不使用引用时,会返回什么?只要我使用不同的文件路径创建输出文件,当我使用引用时会出现一些问题吗?如果您返回一个引用,就会得到一
sub createOutputFile {
my $filepath = shift;
open my $fh, '>', $filepath;
return $fh;
当最后一行作为refreferencereturn\$fh
返回时
我知道$fh存在于createOutputFile子例程的本地范围中,但当我不使用引用时,会返回什么?只要我使用不同的文件路径创建输出文件,当我使用引用时会出现一些问题吗?如果您返回一个引用,就会得到一个引用。这意味着
print $ref
会回来吗
REF(0x600077f10)
您需要取消对它的引用以获得文件句柄。它不会在离开子例程后消失,因为仍然有一个指向它的引用:您返回的引用(假定您将其分配给变量)。您可能知道,Perl使用引用计数,因此在没有引用之前,不会对文件句柄进行垃圾收集
请注意,不能在菱形运算符中使用解引用(它被解释为a),因此必须使用变量
my $fh = $$fh_ref;
while (<$fh>) {
文件路径与返回文件句柄的方式完全无关。问题的一部分似乎与作用域相关,可能是因为习惯了C等语言,其中返回指向堆栈中只存在于返回子例程中的实体的指针是一个bug。Perl的引用计数消除了这种担忧。
while (readline $$fh_ref) {