I'm learning Lua. I decided to make a simple plain PPM decoder/encoder without error checks to familiarize myself with the language. I would appreciate any feedback on how could I make the following code simpler, shorter, more elegant and readable.-- Load/save plain PPMs without error checking; img[img.w][img.h].r=img.maxVal-- sets the red channel of pixel at the top-right corner to the reddest valuelocal p3 = {}function p3.load(path)    local file = io.open(path)    local data = file:read('a')    file:close()    data = data:gsub('#[^\n]*', ' ') -- remove comments    local w, h, maxVal = data:match('P3'..('%s*(%d+)'):rep(3))    w, h, maxVal = tonumber(w), tonumber(h), tonumber(maxVal)    data = data:sub(#data:match('P3'..('%s*%d+'):rep(3)) + 1) -- remove header    local img = { w = w, h = h, maxVal = maxVal }    for x = 1, w do        img[x] = {}        for y = 1, h do            img[x][y] = {}        end    end    local channels = { 'r', 'g', 'b' }    local startIndex, endIndex = 1, 1    for y = h, 1, -1 do        for x = 1, w do            for _, ch in ipairs(channels) do                startIndex, endIndex = data:find('%d+', startIndex)                img[x][y][ch] = tonumber(data:sub(startIndex, endIndex))                startIndex = endIndex + 1            end        end    end    return imgendfunction p3.save(img, path)    local file = io.open(path, 'w')    file:write('P3\n', img.w, ' ', img.h, '\n', img.maxVal, '\n')    for y = img.h, 1, -1 do        for x = 1, img.w do            file:write(img[x][y].r, ' ', img[x][y].g, ' ', img[x][y].b, '\n')        end    end    file:close()endreturn p3
Load/save plain PPMs without error checking
beginner;image;io;lua
Seems readable enough for me. When you're working with a standardized data there is no room for ingenuity, just a mechanical work that needs to be done correctly.Maybe it is only this snippet 'P3'..('%s*(%d+)'):rep(3), that makes you thin for a while, whether there will be three 'P3's in result.