在Lua中处理管道io
我已经为此搜索了很多,但在任何地方都找不到答案。我正在尝试做如下事情:在Lua中处理管道io,io,lua,pipe,stdin,Io,Lua,Pipe,Stdin,我已经为此搜索了很多,但在任何地方都找不到答案。我正在尝试做如下事情: cat somefile.txt|grep somepattern|/script.lua 我还没有在Lua中找到一个处理管道io的资源,也不知道如何做。有没有一个好的方法,非黑客的方法来解决它?最好是缓冲以降低内存使用,但如果这是唯一的选择,我会满足于一次读取整个文件 如果必须将其写入临时文件,然后将其加载到程序中,那将非常令人失望 提前感谢。标准库有一个io.stdin和一个io.stdout,您可以使用它进行输入和输出
cat somefile.txt|grep somepattern|/script.lua
我还没有在Lua中找到一个处理管道io的资源,也不知道如何做。有没有一个好的方法,非黑客的方法来解决它?最好是缓冲以降低内存使用,但如果这是唯一的选择,我会满足于一次读取整个文件
如果必须将其写入临时文件,然后将其加载到程序中,那将非常令人失望
提前感谢。标准库有一个
io.stdin
和一个io.stdout
,您可以使用它进行输入和输出,而不必求助于临时文件。您还可以使用io.read
isntead ofsomeFile:read
,默认情况下它将从stdin读取
缓冲由提供管道的操作系统负责。在编写程序时,您不需要太担心它
编辑:显然,当您提到缓冲时,您考虑的是读取文件的一部分,而不是将整个文件加载到字符串中
io.read
可以使用数值参数从输入中读取一定数量的字节,如果无法读取任何字符,则返回nil
local size = 2^13 -- good buffer size (8K)
while true do
local block = io.read(size)
if not block then break end
io.write(block)
end
标准库有一个
io.stdin
和一个io.stdout
,您可以使用它进行输入和输出,而不必求助于临时文件。您还可以使用io.read
isntead ofsomeFile:read
,默认情况下它将从stdin读取
缓冲由提供管道的操作系统负责。在编写程序时,您不需要太担心它
编辑:显然,当您提到缓冲时,您考虑的是读取文件的一部分,而不是将整个文件加载到字符串中
io.read
可以使用数值参数从输入中读取一定数量的字节,如果无法读取任何字符,则返回nil
local size = 2^13 -- good buffer size (8K)
while true do
local block = io.read(size)
if not block then break end
io.write(block)
end
另一个(更简单的)替代方法是io.lines()迭代器,但括号内没有文件名。例如:
for line in io.lines() do
print(line)
end
function io.chars(n,filename)
n = n or 1 --default number of characters to read at a time
local chars = ''
local wrap, yield = coroutine.wrap, coroutine.yield
return wrap(function()
for line in io.lines(filename) do
line = chars .. line .. '\n'
while #line >= n do
yield(line:sub(1,n))
line = line:sub(n+1)
end
chars = line
end
if chars ~= '' then yield(chars) end
end)
end
for text in io.chars(30) do
io.write(text)
end
更新:要获得大量字符,您可以围绕它编写一个包装器。例如:
for line in io.lines() do
print(line)
end
function io.chars(n,filename)
n = n or 1 --default number of characters to read at a time
local chars = ''
local wrap, yield = coroutine.wrap, coroutine.yield
return wrap(function()
for line in io.lines(filename) do
line = chars .. line .. '\n'
while #line >= n do
yield(line:sub(1,n))
line = line:sub(n+1)
end
chars = line
end
if chars ~= '' then yield(chars) end
end)
end
for text in io.chars(30) do
io.write(text)
end
另一个(更简单的)替代方法是io.lines()迭代器,但括号内没有文件名。例如:
for line in io.lines() do
print(line)
end
function io.chars(n,filename)
n = n or 1 --default number of characters to read at a time
local chars = ''
local wrap, yield = coroutine.wrap, coroutine.yield
return wrap(function()
for line in io.lines(filename) do
line = chars .. line .. '\n'
while #line >= n do
yield(line:sub(1,n))
line = line:sub(n+1)
end
chars = line
end
if chars ~= '' then yield(chars) end
end)
end
for text in io.chars(30) do
io.write(text)
end
更新:要获得大量字符,您可以围绕它编写一个包装器。例如:
for line in io.lines() do
print(line)
end
function io.chars(n,filename)
n = n or 1 --default number of characters to read at a time
local chars = ''
local wrap, yield = coroutine.wrap, coroutine.yield
return wrap(function()
for line in io.lines(filename) do
line = chars .. line .. '\n'
while #line >= n do
yield(line:sub(1,n))
line = line:sub(n+1)
end
chars = line
end
if chars ~= '' then yield(chars) end
end)
end
for text in io.chars(30) do
io.write(text)
end
这一页的最后一块对我来说已经很好了,如果你能在回答中加入这个例子,那就太酷了。这正是我所说的缓冲。这相当于将stdin中的n个字节读入一个数组,而不是将整个文件一次读入C中的内存。谢谢。页面的最后一块对我来说是解决问题的方法,如果你能在回答中包含这个例子,那就太酷了。这正是我所说的缓冲。这相当于从stdin读取n个字节到一个数组中,而不是在C中一次将整个文件拉入内存。谢谢。这让我想起了Python,谢谢你的提示!有没有办法让它不用读一行,而是读
n
chars?让我想起Python,谢谢你的提示!有没有办法让它不用读一行,而是读n
chars?