string.find с использованием пути к каталогу в Lua - PullRequest
0 голосов
/ 07 июля 2010

Мне нужно перевести этот кусок кода с Perl на Lua

open(FILE, '/proc/meminfo');   
while(<FILE>)  
{  
    if (m/MemTotal/)  
    {  
        $mem = $_;  
        $mem =~ s/.*:(.*)/$1/;
    }  
    elseif (m/MemFree/)
    {
        $memfree = $_;
        $memfree =~ s/.*:(.*)/$1/;
    }
}
close(FILE);

Пока я написал это

while assert(io.open("/proc/meminfo", "r")) do
    Currentline = string.find(/proc/meminfo, "m/MemTotal")
    if Currentline = m/MemTotal then
        Mem = Currentline
        Mem = string.gsub(Mem, ".*", "(.*)", 1)
    elseif m/MemFree then
        Memfree = Currentline
        Memfree = string.gsub(Memfree, ".*", "(.*)", 1)
    end
end
io.close("/proc/meminfo")

Теперь, когда я пытаюсь скомпилировать, я получаюследующая ошибка, связанная со второй строкой моего кода

luac: Perl to Lua:122: unexpected symbol near '/'

, очевидно, синтаксис использования пути к каталогу в string.find отличается от того, как я его написал.'Но как это?'мой вопрос.

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Вам не нужно придерживаться потока управления Perl.У Lua есть очень хорошая функция "gmatch", которая позволяет вам перебирать все возможные совпадения в строке.Вот функция, которая анализирует / proc / meminfo и возвращает ее в виде таблицы:

function get_meminfo(fn)
    local r={}
    local f=assert(io.open(fn,"r"))
    -- read the whole file into s
    local s=f:read("*a")
    -- now enumerate all occurances of "SomeName: SomeValue"
    -- and assign the text of SomeName and SomeValue to k and v
    for k,v in string.gmatch(s,"(%w+): *(%d+)") do
            -- Save into table:
        r[k]=v
    end 
    f:close()
    return r
end
-- use it
m=get_meminfo("/proc/meminfo")
print(m.MemTotal, m.MemFree)
1 голос
/ 07 июля 2010

Для перебора файла строка за строкой вы можете использовать io.lines.

for line in io.lines("/proc/meminfo") do
    if line:find("MemTotal") then --// Syntactic sugar for string.find(line, "MemTotal")
        --// If logic here...
    elseif --// I don't quite understand this part in your code.
    end
end

После этого не нужно закрывать файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...