Perl脚本与matlab中的文件描述符混淆

Perl script messes with file descriptor in matlab

我使用 perl 脚本替换数据文件中的一些字符串。 perl 脚本从 matlab 程序中调用,该程序在执行 perl 脚本之前和执行之后写入数据文件。

然后我的 matlab 程序将写入数据文件,但由于某种原因它没有。

这是一个最小的例子: Matlab代码:

f = fopen('output.txt','a');
fprintf(f,'This is written\n');
perl('replace.perl','output.txt');
fprintf(f,'This is not\n');
[fname perm] = fopen(f)
type('output.txt');
fclose(f);

perl 脚本:

#!/usr/bin/perl -i
while(<>){
  s/This/This here/;
  print; 
}
close;  

变量 fname 和 perm 被正确赋值。 type的输出只有"This here is written"。

我对 perl 还很陌生,所以我可能在脚本中犯了一些我找不到的菜鸟错误。 感谢您的帮助。

秘密就在-i。在 perl 和许多其他程序中的就地编辑是通过打开原始文件进行读取,打开临时文件进行写入,然后取消链接原始文件并将临时文件重命名为原始文件的名称来完成的。

现在在 运行 你的 perl 脚本之后,可怜的 matlab 留下了一个指向现在未链接文件的文件句柄。你继续写,但是没有简单的方法可以看到写了什么......即使文件没有从 matlab 下改变出来,你也必须处理这样一个事实,即 matlab 即将写入一个现在会不再是文件的结尾。

最后,您需要非常小心让两个programs/users/computers同时写入同一个文件。在调用 perl 之前关闭 matlab 文件句柄。如果证明确实有必要,请重新打开它以便稍后追加。