我想将这个Python代码转换为Lua(nmap
脚本):
for i in range(1000, 9999):
if str(i).endswith('9'):
print(i)
Run Code Online (Sandbox Code Playgroud)
我已经走到这一步了:
for var = 1000, 9000 then
if tostring(var).endswith('9') then
print (var)
end
end
Run Code Online (Sandbox Code Playgroud)
但我不知道 Lua 相当于endswith()
.
如何最好地将代码移植到 Lua 的 X 问题已经被Quantumpro 回答了,他优化了它并清理了它。
我将重点关注您的 Y 问题:
Python 的 Lua 等价物是什么
endswith
?
在Lua中,字符串有一个元表,用于索引全局string
库表。在 Lua 中调用字符串函数str:func(...)
,而不是str.func(...)
将字符串str
作为第一个“self”参数传递(请参阅“Lua 之间和Lua 中的差异”.
:
)。
此外,如果调用的参数是单个字符串,您可以省略括号,str:func("...")
变成str:func"..."
.
Lua提供了更强大的模式匹配功能,可以用来检查字符串是否以后缀结尾:string.match
。str.endswith("9")
在 Python 中相当于str:match"9$"
在 Lua 中:$
将模式锚定在字符串末尾并9
匹配文字字符9
。
但要小心:这种方法不适用于任意的、可能变量的情况,因为某些字符(例如$
)是Lua 模式中的魔术字符,因此具有特殊的含义。考虑str.endswith(".")
; 这与 Lua 中的不等价string:match".$"
,因为它.
匹配任何字符。
我想说这是检查字符串是否以常量后缀结尾的 lua 式方法。请注意,如果成功,它不会返回 boolean,而是返回一个匹配项(后缀,一个真值);如果不成功,则返回一个nil
匹配项(一个假值);因此它可以安全地在 s 中使用if
。要将结果转换为布尔值,您可以使用not not string:match"9$"
.
Lua的标准库非常简约;因此,即使是基本的事情,您也经常需要推出自己的函数。有两种可能的实现endswith
,一种使用模式匹配,另一种使用子字符串;后一种方法更可取,因为它更短,可能更快(Lua 使用简单的模式匹配引擎)并且不必处理模式转义:
function string:endswith(suffix)
return self:sub(-#suffix) == suffix
end
Run Code Online (Sandbox Code Playgroud)
说明:返回第一个参数self:sub(-#suffix)
的最后一个后缀长度字符。self
这是与后缀进行比较的。
然后您可以使用冒号 ( :
) 语法调用此函数:
str = "prefixsuffix"
assert(str:endswith"suffix")
assert(not str:endswith"prefix")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3674 次 |
最近记录: |