Синтаксический анализ аргументов в файле Lua

#lua

#lua

Вопрос:

У меня есть File: data.lua

 #! /usr/bin/env lua
local a = {
    b = {
        c = {
            version = "z.y"
        },
        d = {
            version = "z.w"

        },
        getcversion = function ( self )
            print( self.c.version )
        end
    }
}
 

Теперь мне нужна функция ‘getcversion ()’..

 a.b:getcversion()
 

Проблема в том, что мне нужно вызвать его извне:

 data.lua "a.b:getcversion()"
 

Я перепробовал все, что мог, но не смог решить эту проблему..

Кто-нибудь знает, как я мог бы вызвать ‘getcversion ()’?

Заранее спасибо, с уважением

Комментарии:

1. Привет, возможно, попробуйте это en.wikibooks.org/wiki/Lua_Programming/command_line_parameter

2. что такое «снаружи»? другой файл Lua?

3. Вне его сценария bash, который вызывает этот файл: data.lua «a.b:getcversion()»

Ответ №1:

Вам нужно будет добавить в свой скрипт что-то вроде следующего:

 load(arg[1], "<string>", "t", {a = a})()
 

load загрузит содержимое переданного параметра ( arg[1] ) и вернет функцию, которая выполнит этот код в определенной среде (предоставленной в виде {a = a} таблицы), поскольку вам необходимо передать значения локальных переменных в ваш код (Lua 5.2 ).

Имейте в виду, что это позволит вызывающей стороне передавать произвольный код Lua в ваш скрипт, что может быть проблемой безопасности.

Обработка ошибок оставлена в качестве упражнения для читателя.

Комментарии:

1. Большое спасибо за вашу помощь в этом.. load (chunk [, chunkname [, mode [, env]]]) Это ответ на проблему 🙂 Пока я буду придерживаться: load( arg[1] .. "()", arg[1] .. "()", "t", {a = a} )() . Благодаря этому я могу вызывать из bash, не экранируя скобки » ()», следующим образом: data.lua a.b:getcversion Спасибо за вашу помощь!

Ответ №2:

Добавьте return a в конец data.lua, чтобы превратить его в модуль, а затем:

 $ lua -e 'a = require("data"); print(a.b:getcversion())'
z.y
 

Комментарии:

1. Спасибо за ваш ответ! еще одно решение, о котором я не знал 🙂