类 IO

公共实例方法

IO#expect(pattern,timeout=9999999) → Array 点击切换源代码
IO#expect(pattern,timeout=9999999) { |result| ... } → nil

expect 库添加了实例方法 IO#expect,它类似于 TCL expect 扩展

要使用此方法,您必须需要 expect

require 'expect'

IO 中读取,直到给定的 pattern 匹配或 timeout 超时。

它返回一个数组,其中包含读取的缓冲区,后跟匹配项。如果给定一个块,结果将被传递给该块并返回 nil。

当不带块调用时,它会等待直到从 IO 中获得与给定 pattern 匹配的输入,或者指定为超时的时长过去。当从 IO 中获得模式时,将返回一个数组。数组的第一个元素是从 IO 中获得的直到模式匹配的整个字符串,后面跟着指示模式与正则表达式中的锚点匹配的元素。

可选的 timeout 参数以秒为单位定义等待模式的总时间。如果超时过期或找到 eof,则返回或传递 nil。但是,超时会话中的缓冲区将保留以供下次 expect 调用使用。默认超时时间为 9999999 秒。

# File pty/lib/expect.rb, line 33
def expect(pat,timeout=9999999)
  buf = ''.dup
  case pat
  when String
    e_pat = Regexp.new(Regexp.quote(pat))
  when Regexp
    e_pat = pat
  else
    raise TypeError, "unsupported pattern class: #{pat.class}"
  end
  @unusedBuf ||= ''
  while true
    if not @unusedBuf.empty?
      c = @unusedBuf.slice!(0)
    elsif !IO.select([self],nil,nil,timeout) or eof? then
      result = nil
      @unusedBuf = buf
      break
    else
      c = getc
    end
    buf << c
    if $expect_verbose
      STDOUT.print c
      STDOUT.flush
    end
    if mat=e_pat.match(buf) then
      result = [buf,*mat.captures]
      break
    end
  end
  if block_given? then
    yield result
  else
    return result
  end
  nil
end