perl:sysread在内存中的文件句柄上?

perl:sysread在内存中的文件句柄上?,perl,Perl,不幸的是,这不起作用: my $input = "this is a test"; open(my $fh, "<", \$input); my $n = sysread($fh, $buf, 4); # want $n == 4, $buf eq 'this' my$input=“这是一个测试”; open(我的$fh,“这是有效的,但是,我不太清楚为什么或者你是否真的想这样做 my $input = "this is a test"; open(my $fh,'-|',"echo

不幸的是,这不起作用:

my $input = "this is a test";
open(my $fh, "<", \$input);
my $n = sysread($fh, $buf, 4);  # want $n == 4, $buf eq 'this'
my$input=“这是一个测试”;

open(我的$fh,“这是有效的,但是,我不太清楚为什么或者你是否真的想这样做

my $input = "this is a test";
open(my $fh,'-|',"echo $a");  # open a pipe instead and echo the string
my $n = sysread($fh,$buf,4) or warn $!; 

请注意,失败的sysread设置
$!
,以便您可以检查错误。

在sysread之后,变量$!是否包含“错误的文件描述符”?那么您可能遇到了错误72428“sysread不适用于标量的文件句柄”()

我在使用标量文件句柄的测试中遇到了这种情况,因为我不想麻烦地创建一个真正的文件。一般来说,如果从那时起这样做就很好了,正如上面的RT票证所说,将文件句柄传递给任何使用
sysread
的模块。如果你想模拟一个输入文件,你可以将
\uuu DATA\uu
构造与
while()一起使用
您应该检查
sysread($fh,$buf,$count)==$count
,而不是返回值是否为
undef
。非常确定
sysread
不会返回并在短时间内为您弥补差异,因此这是您自己要处理的问题。这是一个非常好的解决方法。但是有一个shell命令行大小限制(在我的系统上为128K),因此它不能在此表单中用于大型或任意大小的数据。