¿Cómo obtener el nombre del archivo actual sin ruta y .lua?

Lo intenté con:

local info = debug.getinfo(1,'S');
print(info.source);

Y esto es lo que obtengo:

@data/spells/scripts/10lvl/bakurichimacha.lua
@data/spells/scripts/1000lvl/brave sword attack.lua

Cómo borrar estas partes:

@data/spells/scripts/10lvl/ and .lua
@data/spells/scripts/1000lvl/ and .lua

Para imprimir solo bakurichimacha y valiente ataque de espada?

1
whiteblXK 23 ene. 2018 a las 16:26

3 respuestas

La mejor respuesta

Prueba esto:

function get_file_name(file)
      return file:match("^.+/(.+)$")
end
3
kingJulian 23 ene. 2018 a las 13:40

Aunque la respuesta @kingjulian aceptada parece estar funcionando en la mayoría de los casos, falla para los argumentos de nombre de archivo sin ruta. P.ej. aTestFile.lua etc.

He modificado un poco la expresión regular para incluir estos escenarios faltantes

function get_file_name(file)
      return file:match("[^/]*.lua$")
end

Probado aquí

Para obtener el único nombre de archivo excluyendo la extensión .lua

function get_file_name(file)
      local file_name = file:match("[^/]*.lua$")
      return file_name:sub(0, #file_name - 4)
end
0
Soham Mahajan 9 jun. 2019 a las 18:36

Puedes usar la función string.match

local filename = function()
  local str = debug.getinfo(2, "S").source:sub(2)
  return str:match("^.*/(.*).lua$") or str
end
print(filename());
1
Valentin Borisov 26 ene. 2018 a las 21:41
48402876