我正在将vt100(oldschool终端)实现为lua,它运行在嵌入式MCU上。性能是一个问题。
给定是一个包含多个(不可预测的数字)字符的字符串(输入行)。 在这个字符串中,我想从一组字符中找到第一个匹配。
例如:
-- ASCII value(hex) of keyboard keys.
#define KEY_UP "\x41"
#define KEY_DOWN "\x42"
#define KEY_RIGHT "\x43"
#define KEY_LEFT "\x44"
-- terminal object is defined and created
function terminal:receive()
-- Set buffer and shorthand to self.port.read
local read = function() return self.port:read() end
local received = ""
while true do
-- Read Input
local line = read()
if ( not line ) then break end
received = received .. line
-- Search for the key.
-- Don't search in line, due different baudrates might not
-- Get the entire digit at once.
if ( received:find( KEY_UP ) ) then
return KEY_UP
elseif ( received:find( KEY_DOWN ) ) then
return KEY_DOWN
... and so on
end
end
end
我的例子中的解决方案有点慢,当然。提出更高性能的解决方案并不难。但对此最有效的解决方案是什么?
答案 0 :(得分:1)
由于您的所有匹配都是一个字符长,您可以使用设置[]
来匹配并捕获()
以查看您匹配的内容。
#define KEY_UP "\x41"
#define KEY_DOWN "\x42"
#define KEY_RIGHT "\x43"
#define KEY_LEFT "\x44"
-- assemble pattern once for performance
local KEY_pattern = "([" .. KEY_UP .. KEY_DOWN .. KEY_RIGHT .. KEY_LEFT .. "])"
-- ............... skipped ...............
local match_start, match_end, match_content = received:find(KEY_pattern)
if ( match_content ) then
return match_content
end
答案 1 :(得分:0)
您可以制作包含您要查找的所有字符的单个图案。然后,您可以捕获结果并将其返回。
如果您在要查找的角色中没有任何优先顺序,则此方法有效。