我试图使用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
答案 0 :(得分:3)
my $fh
的范围限定在封闭区块中。此变量是对文件句柄的唯一引用。当文件句柄被销毁时,文件被关闭,文件描述符号可以重用于下一个文件。 FD只是一个整数,没有任何魔法可以保持文件打开。
通过保持对数组中打开的文件句柄的引用,您已经延长了文件句柄的生命周期。因此,每个新文件都会获得一个新的FD编号。