2010-07-15 20 views
2

Ok, je pense que j'ai trop compliqué les choses et maintenant je suis perdu. En fait, je dois traduire, de Perl à Lua:Expressions régulières dans Lua en utilisant .gsub()

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

} 
close(FILE); 

Jusqu'à présent, je l'ai écrit:

for Line in io.lines("/proc/meminfo") do 
    if Line:find("MemTotal") then 
     Mem = Line 
     Mem = string.gsub(Mem, ".*", ".*", 1) 
    end 
end 

Mais il est évidemment faux. Qu'est-ce que je ne reçois pas? Je comprends pourquoi il ne va pas, et ce qu'il est en train de faire et pourquoi quand je fais

print(Mem) 

il retourne

.* 

mais je ne comprends pas quelle est la bonne façon de le faire. Les expressions régulières me confondent!

Répondre

1

Lua n'utilise pas d'expressions régulières. Voir Programmation dans Lua, sections 20.1 et suivantes pour comprendre comment fonctionne le filtrage et le remplacement dans Lua et où il diffère des expressions régulières.

Dans votre cas, vous remplacez la chaîne complète (.*) par la chaîne littérale .* - il n'est pas surprenant que vous obteniez seulement .* retourné.

L'expression régulière d'origine remplacé tout ce qui contient deux points (.*:(.*)) par la partie après les deux points, donc une déclaration similaire dans Lua pourrait être

string.gsub(Mem, ".*:(.*)", "%1") 
+0

ok, Je vous remercie. Cela a du sens maintenant, je pense juste que je ne serai jamais capable de comprendre pleinement les expressions régulières. – OddCore

+3

Le groupe de capture ('(. *)') Est inutile. 'string.gsub (Mem,". *: "," ")' est suffisant. Il supprime tout jusqu'à la dernière ':'. –

+0

@Mizard: Je viens de copier le code verbatim du code Perl, mais en effet cela devrait suffire, oui. – Joey

3

Le code parse ci-dessous le contenu de ce fichier et le met dans un tableau:

meminfo={} 
for Line in io.lines("/proc/meminfo") do 
    local k,v=Line:match("(.-): *(%d+)") 
    if k~=nil and v~=nil then meminfo[k]=tonumber(v) end 
end 

Vous pouvez alors faire juste

print(meminfo.MemTotal) 
+1

C'est une solution bien meilleure et plus complète. – daurnimator