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

标签 perl file filehandler

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

这是我的代码:

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

执行后,我的文件包含以下内容:

fname1 为空

fname2 硬币

Hi this is fh1

哪里出错了?

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

最佳答案

您已设置 $fh1$fh2相同的值(一个空格字符,而不是 NULL),因此它们为 I/O 引用相同的底层 typeglob。

Perl 中的文件句柄是一种特殊的变量类型,称为 glob 或 typeglob。在过去的 Perl 4 时代,您总是将 glob 称为字符串,通常称为裸词。裸词 STDIN , STDOUT , 和 STDERR是这个更简单时代的遗物。

如今,您可以(通常应该)使用词法文件句柄,但对类型团的底层引用仍然存在。例如,你可以这样写

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

这将做与

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

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

但是如果参数为open已经初始化,Perl 使用带有该参数值的类型团。所以这段代码将创建数据并将其添加到文件中:

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

现在我们可以看看你的例子。您已设置 $fh1$fh2相同的值——一个由空格字符组成的字符串。所以你的 open调用 $fh1在名为 " " 的类型团之间创建关联和输出流的文件描述符 $fname1 .

当您调用 open 时在 $fh2 ,您正在重用名为 " " 的类型团,这将自动关闭使用相同类型团( $fh1 )的其他文件句柄,就像您说 open FOO, ">/tmp/1"; open FOO, ">/tmp/2" 一样, 第二个 open调用将隐式 close第一个文件句柄。

现在您正在打印 $fh1 ,它指的是名为 " " 的类型团,它与输出流关联到文件 $fname2 ,这就是输出的地方。

初始化错误 $fh1$fh2 .只是让他们未定义:

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

关于perl - 文件句柄在 Perl 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29762796/

相关文章:

file - 如何将gzip文件移动到hdfs

perl - 如何判断两个句柄是否指向同一个文件

javascript - 将大小和名称传递给 JavaScript 的 FileHandler 的 .onload 事件

linux - 如何在 git bash 中编写动态字符串替换?

python - 处理两个大文件的高效 Python 方法?

php - 将perl关联数组转换为JSON并在PHP中读取

C- 编辑/更新文件(不一定在最后)。 fopen(路径, "a+")不起作用

java - FileHandler.limit java 7 不工作

windows - 在 Perl 脚本中播放声音

perl - 案例独立排序