Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl子例程中返回文件句柄_Perl_Reference_Scope - Fatal编程技术网

在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;
当最后一行作为refreference
return\$fh
返回时


我知道$fh存在于createOutputFile子例程的本地范围中,但当我不使用引用时,会返回什么?只要我使用不同的文件路径创建输出文件,当我使用引用时会出现一些问题吗?

如果您返回一个引用,就会得到一个引用。这意味着

print $ref
会回来吗

REF(0x600077f10)  
您需要取消对它的引用以获得文件句柄。它不会在离开子例程后消失,因为仍然有一个指向它的引用:您返回的引用(假定您将其分配给变量)。您可能知道,Perl使用引用计数,因此在没有引用之前,不会对文件句柄进行垃圾收集

请注意,不能在菱形运算符中使用解引用(它被解释为a),因此必须使用变量

my $fh = $$fh_ref;
while (<$fh>) {

文件路径与返回文件句柄的方式完全无关。

问题的一部分似乎与作用域相关,可能是因为习惯了C等语言,其中返回指向堆栈中只存在于返回子例程中的实体的指针是一个bug。Perl的引用计数消除了这种担忧。
while (readline $$fh_ref) {