在Perl中打开标量作为文件

5
根据PerlDoc的介绍,您可以将文件打开到标量变量中 https://perldoc.perl.org/functions/open#Opening-a-filehandle-into-an-in-memory-scalar
我正在尝试确定是否可以使用这种方法来处理词法域内持久的临时文件。 我正在进行以下测试:
my $memfile;
my $filename=\$memfile;

open (OUT, ">", $filename);
print OUT "some data\n";
close (OUT);

我希望能够从标量中读取数据,例如:

open (IN, "<", $filename);
while (my $in=<IN>)
{
  print "$in\n";
}
close (IN);

这个不起作用,所以我是疯了还是有正确的方法让它起作用呢?


1
perl -wE'open my $fh, ">", \my $mem or die $!; say $fh "hi"; say "var: $mem"' 运行正常。 - zdim
或者,如果你坚持要使用另一层变量(为什么呢?),perl -wE'my $mem; my $f = \$mem; open my $fh, ">", $f or die $!; say $fh "hi"; say "var: $mem"' 也可以正常工作。 - zdim
我在实际测试代码中打了一个错别字,现在我已经修复了它,它可以正常工作。我现在感觉很愚蠢。 - quentinnuk
我的实际测试代码中有个错别字,好吧,这种事情每个人都会发生 :) - zdim
“在词法域内持久存在的临时文件,可以使用这种方法。” 顺便问一下,“持久”和“词法域”是什么意思?是指该文件在作用域内存在,一旦离开该作用域就消失了吗?也许可以看看 File::Temp - zdim
1
还在/r/perl上提问过(https://www.reddit.com/r/perl/comments/10jn0hb/using_a_scalar_as_a_file_in_perl5/)。可以转发,但请告知其他人你正在这样做,以免浪费时间回答已经有答案的问题。 - brian d foy
1个回答

7

我们确实可以打开一个文件句柄到一个变量,并向其写入;然后我们就可以像使用任何其他变量一样使用它。

open my $fhv, '>', \my $memfile or die $!;
say $fhv "hi";
close $fhv;

print $memfile;  # hi\n

我们也可以打开变量引用的文件句柄进行读取,就像问题中一样,但这通常是不必要的。(可能的用途是,如果我们想保持写入和读取,以便可以通过更改open语句仅在文件/变量之间进行更改。)

这也适用于另一个“层次”的变量,就像问题中一样。

 my $memfile;
 my $file = \$memfile;
 open my $fhv, '>', $file or die $!;
 say $fhv "hi";
 close $fhv;

 print $memfile;

可以再次打开文件句柄$file以进行读取。

请注意,$fhv并不是一个完全正确的文件句柄,有些文件句柄用法可能无法正常工作;请参见this page中的一个示例。


原来我的测试代码中有个打字错误,当我修复它后,它当然可以工作。我现在感觉很愚蠢。 - quentinnuk
好的,这种情况时有发生 :). 顺便说一下,如果你需要更高级和灵活(等等)的读写资源的方法,请尝试使用 IPC::Run。它支持各种各样的东西。 - zdim
@quentinnuk 做了一些编辑,没有太大的改动,但你可能想要看一下。 - zdim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接