char* line = NULL; ssize_t line_size; while (1) { SV* line_sv; ssize_t len = getline(&line, &line_size, fh); if (len < 0) last; line_sv = newSVpvn(line, len); ... } if (line) free(line);