哈希一直无法迭代

时间:2015-08-17 16:45:16

标签: ruby

我正在尝试遍历文件夹,选择以.bowtie.txt结尾的所有文件,计算行数,然后将带有文件名的行数写入散列(甚至是哈希)更好的外部csv但哈希现在会做的)。我得到了这个解决方案

Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file|
  memo[file] = File.readlines(file).select do |line| 
                 line =~ /^[0-9]+\s*(\+|\-)/ # only those, matching
               end.count
  puts memo
end

然而,这必须选择一个文件,然后在失败之前给我一个哈希,如下所示:

Me:~ me$ ruby /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb
{"/Volumes/SeagateBackupPlusDriv/SequencingRawFiles/TumourOesophagealOCCAMS/SequencingScripts/3finalcounts/SLX-9279.GoodDysplasia.FSeqA_BEST2_NEW_0204_LessThan10PCent_HGD_.fq.gz.bowtie.txt"=>31312}
/Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:5:in `block in <main>': undefined method `[]=' for nil:NilClass (NoMethodError)
        from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `each'
        from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `inject'
        from /Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:4:in `<main>'

当我不使用puts memo时,我没有收到错误但我也没有收到任何输出到终端。我如何得到我想要的东西?

2 个答案:

答案 0 :(得分:3)

为了在此上下文中使用inject,您需要在结尾处返回memo对象。所以在你的例子中,这看起来像是:

Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file|
  memo[file] = File.readlines(file).select do |line| 
                 line =~ /^[0-9]+\s*(\+|\-)/ # only those, matching
               end.count
  puts memo
  memo
end

这是一个人为的例子来说明同样的错误&amp;分辨率:

[1] pry(main)> [1, 2, 3].inject({}) { |hash, num| hash[num] = 1 }
NoMethodError: undefined method []= for 1:Fixnum
[2] pry(main)> [1, 2, 3].inject({}) { |hash, num| hash[num] = 1; hash }
=> {1=>1, 2=>1, 3=>1}

答案 1 :(得分:1)

如果你使用org.hibernate:hibernate-entitymanager:4.3.10.Final你的块应该总是在最后一行返回更新的inject。在你的情况下,在第二次迭代期间,备忘录等于最后一行,因此对于put memo

的结果
memo