Я использую File :: Map часто для отображения особенно небольших текстовых файлов в памяти и, например, обработки некоторых регулярных выражений только для чтения.Теперь у меня есть сценарий использования, в котором мне также нужно заменить некоторый текст в файле, и я подумал, что я все еще могу использовать File::Map
, потому что он документирует следующее:
Файлы отображаются впеременная, которая может быть прочитана так же, как и любая другая переменная, и она может быть записана с использованием стандартных методов Perl, таких как regexps и substr.
В то время как данные, которые меня интересуют для замены, должным образом заменяются внутрифайл, я теряю данные, потому что файл сохраняет свой первоначальный размер, и данные в конце усекаются.Новые данные немного больше, чем старые.Обе вещи предупреждаются, как описано в следующих предложениях:
Запись непосредственно в файл с отображением в памяти не рекомендуется
Усечение нового значения до размера карты памяти
Пояснения к обоим предупреждениям читаются так, будто никто не должен писать что-либо, используя File::Map
, но это может сработать в тех случаях, когда можно работать с усеченными файлами, или общий размер файла просто не изменяется вообще.Но в первой цитате явно упоминаются записи как поддерживаемые без каких-либо исключений из этого правила.
Итак, есть ли какой-то особый способ безопасной записи с использованием File::Map
, например увеличение основного файла и так далее?Первое предупреждение использует формулировку directly
, и у меня такое ощущение, что есть какой-то другой, лучше поддерживаемый способ записи?
В настоящее время я просто использую =~ 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
В конце концов, если вообще следует избегать записи, почему в документах прямо упоминается, что она поддерживается?Мне не кажется поддерживаемым, если это приводит, по крайней мере, к предупреждению во всех случаях, кроме одного.