fileno和引用削弱混乱

时间:2017-08-27 12:17:32

标签: perl

我试图使用fileno为我的线程创建一个文件句柄表,我遇到了一个我无法理解的情况。请考虑以下代码:

for i in range(1,100,2):
    print(str(i), end=',')

我得到的输出是:

use strict;
use Data::Dumper;
my %fhh; #this is shared, but that's not important for my issue
open my $fh , '>', 'out1.txt' ;
$fhh{1} = fileno $fh;
open my $fh , '>', 'out2.txt' ;
$fhh{2} = fileno $fh;
open my $fh , '>', 'out3.txt' ;
$fhh{3} = fileno $fh;
open my $fh , '>', 'out4.txt' ;
$fhh{4} = fileno $fh;
print Dumper \%fhh;

到目前为止一直很好,不幸的是我需要生成一个未知数量的句柄,所以我尝试了以下代码:

$VAR1 = {
          '4' => '9',
          '1' => '6',
          '3' => '8',
          '2' => '7'
        };

这里我得到了输出:

use strict;
use Data::Dumper;
my %fhh;
foreach my $i (1 .. 4){
    my $file = "out" . $i . ".txt";
    open my $fh , '>',  $file ;
    $fhh{$i} = fileno $fh;
}
print Dumper \%fhh;

所以有些不对劲,也许这里$ fh会被削弱并丢失?所以我尝试了以下内容:

$VAR1 = {
          '4' => '10',
          '1' => '10',
          '3' => '10',
          '2' => '10'
        };

这里输出再次正确,就像在第一个例子中一样,所以它似乎确实是一个弱化问题,但那么为什么在第一个例子中没有发生这种情况呢?我每次都重新定义$ fh,即使我在{}中包围了整个块,它仍然可以正常工作,有人可以向我解释发生了什么吗? 如果那很重要的话,我正在使用perl 5.14

1 个答案:

答案 0 :(得分:3)

my $fh的范围限定在封闭区块中。此变量是对文件句柄的唯一引用。当文件句柄被销毁时,文件被关闭,文件描述符号可以重用于下一个文件。 FD只是一个整数,没有任何魔法可以保持文件打开。

通过保持对数组中打开的文件句柄的引用,您已经延长了文件句柄的生命周期。因此,每个新文件都会获得一个新的FD编号。