File::Map
,因为它记录了以下内容:
虽然我需要替换的数据已经正确地替换到了文件中,但是我会失去数据,因为文件保留了原始大小,并且在最后截断数据。新数据比旧数据稍微多一点。这两个问题都在以下句子中被警告:文件被映射到一个变量中,可以像任何其他变量一样进行读取,可以使用标准Perl技术(如正则表达式和substr)进行写入。
这两个警告的解释似乎意味着永远不应该使用不建议直接向内存映射文件中写入
将新值截断为内存映射的大小
File::Map
写入任何内容,但是在某些情况下也可能起作用,例如可以接受截断文件或者整个文件大小根本没有改变。但是第一个引用明确提到了写操作是被支持的,没有任何例外。因此,是否有一种安全的方式可以使用
File::Map
进行写入,例如增加底层文件等?第一个警告使用了“直接”这个词,我感觉可能有其他更好的支持写入的方式?我目前只是在映射视图上使用
=~ s///
,这似乎是错误的方法。我甚至找不到任何人尝试过使用File::Map
进行写入,仅找到官方测试执行的和我执行的相同,并期望得到警告。此外,查看代码时,似乎只有一种用例中写入时根本不会产生警告,尽管我不理解如何触发该用例:static int mmap_write(pTHX_ SV* var, MAGIC* magic) {
struct mmap_info* info = (struct mmap_info*) magic->mg_ptr;
if (!SvOK(var))
mmap_fixup(aTHX_ var, info, NULL, 0);
else if (!SvPOK(var)) {
STRLEN len;
const char* string = SvPV(var, len);
mmap_fixup(aTHX_ var, info, string, len);
}
else if (SvPVX(var) != info->fake_address)
mmap_fixup(aTHX_ var, info, SvPVX(var), SvCUR(var));
else
SvPOK_only_UTF8(var);
return 0;
}
https://metacpan.org/source/LEONT/File-Map-0.55/lib/File/Map.xs#L240
如果要避免使用写操作,那么为什么文档明确提到支持它呢?但在除一种情况外的所有情况下,它至少会导致一个警告,所以看起来并不被支持。
File::Map
和使用具有读写访问权限的文件句柄(例如,在+<
模式下打开)之间有什么区别?当您使用读写文件句柄时,还必须小心不要覆盖现有数据并在缩小文件时截断它,但有时仍然很有用。 - mob