while (1) { // Actually allocates at least 256. SV* line_sv = newSV(255); // We know line_sv has a string buffer, so we can use SvPVX. char* line = SvPVX(line_sv); if (!fgets(line, 256, fh)) { break; } SvCUR_set(line_sv, strlen(line)); SvPOK_on(line_sv); ... // The callback may have changed line_sv, // so line might no longer be valid. line = SvPVbyte_nolen(line_sv); printf("c orig: %sc new: %s", line, modified_line); ... }