Ruby stdin不起作用

Ruby stdin不起作用,ruby,Ruby,我有以下脚本: $stdin.each_line do |data| blocks = data.scan(/\+[^+]+\+/) blocks.reject! { |b| b.include? "AAAAAAAAA" } p blocks end 此脚本将删除stdin文件中的A字符串。我有两个问题: stdin似乎不起作用,它输出[] 如何修改脚本以表示拒绝长度为20或以上的一段单字母,因此如果有长度为20或以上的a,请删除该块 要拒绝包含20个或更多

我有以下脚本:

$stdin.each_line do |data|    
  blocks = data.scan(/\+[^+]+\+/)
  blocks.reject! { |b| b.include? "AAAAAAAAA" }    
  p blocks    
end
此脚本将删除stdin文件中的A字符串。我有两个问题:

  • stdin似乎不起作用,它输出
    []
  • 如何修改脚本以表示拒绝长度为20或以上的一段单字母,因此如果有长度为20或以上的a,请删除该块

  • 要拒绝包含20个或更多相同大写字符的所有块,请执行以下操作:

    $stdin.each_line do |data|
      blocks = data.scan(/\+[^+]+\+/)
      ('A'..'Z').each do |ch|
        r = Regexp.new("[" + ch + "]{20,}")
        blocks.reject! { |b| r =~ b }
      end
      p blocks
    end
    
    这将生成26个正则表达式(每个大写字符对应一个正则表达式),并根据它们匹配块。
    当然,只构建一次并将它们存储在数组或类似的数组中,而不是为输入中的每一行重新构建它们,效率会更高

    更紧凑的解决方案:

      r = /([a-z])\1{19,}/
      $stdin.each_line do |data|
          blocks = data.scan(/\+[^+]+\+/)
          blocks.reject! { |b| r =~ b }
          p blocks
      end
    

    这一个使用一个正则表达式来匹配单个字符,然后直接匹配19个或更多相同字符(使用反向引用)。

    拒绝的正则表达式!声明如下:

    /([A-Z])\1{19}/
    

    这将匹配任何大写字母,后跟19个完全相同的字母。

    您如何发送输入?您是否也可以添加您想要的测试输入/输出?您所说的“它不工作”是什么意思?如果我执行你的脚本并输入+aaaaaaa++BBBBB++aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。你到底想拆分/拒绝什么?请提供一个例子。不确定,但可能与此问题相关/相同。分子生物学研究还是什么
    A
    代表腺嘌呤?你测试过吗?如果运行此脚本并在一行中输入+AAAAA++BBBBB++aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。如果这不是您所期望的,请解释您正试图实现的目标。当我运行脚本时,我有一个包含许多+/n到/n+的文件,当我输入数据文件号时,它只输出[]。知道为什么吗?thanks@Mark请发布一个完整的会话示例,包括您在STDIN上输入的数据,并解释您的脚本与您期望的不同之处!