文件句柄在Perl中无法正常工作

时间:2015-04-21 04:14:48

标签: perl file filehandler

我尝试将两个文件句柄初始化为NULL,然后在我的程序中使用它。

这是我的代码:

my $fh1 = " ";
my $fh2 = " ";
open($fh1, ">", $fname1);
open($fh2, ">", $fname2);
print $fh1 "HI this is fh1";

执行后,我的文件包含:

fname1为空

fname2 cointains

Hi this is fh1

错误是什么?

为什么fname1为空而fname2包含字符串,即使我没有在fh2中插入任何字符串?

2 个答案:

答案 0 :(得分:3)

您已将$fh1$fh2设置为相同的值(空格字符,而不是NULL),因此它们为I / O引用相同的基础类型地球。

Perl中的Filehandle是一种称为glob或typeglob的特殊变量类型。在Perl 4的旧时代,你总是将glob称为字符串,通常作为一个字符串。简言之STDINSTDOUTSTDERR是这个简单时间的遗物。

如今,你可以(并且通常应该)使用词法文件句柄,但对typeglob的基础引用仍然存在。例如,您可以写

my $fh = 'STDOUT';
print $fh "hello world\n";

这将与

完全相同
print STDOUT "hello world\n";

现在,如果您将未初始化的标量作为open的第一个参数传递,Perl将为其分配一个任意类型的颜色。你可能不需要知道它是哪种类型的。

但是如果open的参数已经初始化,Perl会使用带有该参数值的typeglob。因此,这段代码将创建数据并将其添加到文件中:

my $fh = "FOO";
open $fh, '>', '/tmp/1';
print FOO "This is going into /tmp/1\n";
close $fh;

现在我们来看看你的例子。您已将$fh1$fh2设置为相同的值 - 由空格字符组成的字符串。因此,open$fh1的调用会在名为" "的typeglob与输出流的文件描述符$fname1之间创建关联。

当您在open上致电$fh2时,您正在重复使用名为" "的typeglob,它将使用相同的typeglob($fh1)自动关闭其他文件句柄,就像你说open FOO, ">/tmp/1"; open FOO, ">/tmp/2"一样,第二个open调用会隐含close第一个文件句柄。

现在您要在$fh1上打印,它引用名为" "的typeglob,它与文件$fname2的输出流相关联,以及输出的输出去。

初始化$fh1$fh2是错误的。请保持未定义:

my ($fh1, $fh2);
open $fh1, ">", ...   # assigns $fh1 to arbitrary typeglob
open $fh2, ">", ...   # assigns $fh2 to different arbitrary typeglob

答案 1 :(得分:1)

您根本不应初始化文件句柄,否则Perl会尝试将该值用作文件句柄而不是创建新文件句柄。在这种情况下,您已在文件句柄$fname1(单个空格)上打开' ',然后在同一文件句柄上打开$fname2,该句柄关闭$fname1

不要单独声明文件句柄,最好在open语句中声明它们,就像这样

open my $fh1, '>', $fname1;
open my $fh2, '>', $fname2;

那么可能会出错的次数