Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 哈希一直无法迭代_Ruby - Fatal编程技术网

Ruby 哈希一直无法迭代

Ruby 哈希一直无法迭代,ruby,Ruby,我正在尝试遍历一个文件夹,选择以.bowtie.txt结尾的所有文件,计算行数,然后用它来自的文件名将行数写入一个哈希(或者更好的是外部csv,但哈希现在就可以了)。我得到了这个解决方案 Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file| memo[file] = File.readlines(file).select do |line| line =~ /^[0-9]+\s*(\+|\-

我正在尝试遍历一个文件夹,选择以.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>'
Me:~Me$ruby/Users/Me/Desktop/SequencingScripts/Plots/generalscript/DistinctPositions.rb
{/Volumes/segatebackupplusdriv/SequencingRawFiles/tumorouseophagealoccams/SequencingScripts/3finalcounts/SLX-9279.GoodDysplasia.FSeqA_BEST2_NEW_0204_lesst 10pcent_HGD_.fq.gz.bowtie.txt=>312}
/Users/me/Desktop/SequencingScripts/Plots/GeneralScripts/DistinctPositions.rb:5:in'block-in':nil:NilClass(NoMethodError)的未定义方法“[]”
from/Users/me/Desktop/SequencingScripts/Plots/generalscript/DistinctPositions.rb:4:in'each'
from/Users/me/Desktop/SequencingScripts/Plots/generalscript/DistinctPositions.rb:4:in'inject'
来自/Users/me/Desktop/SequencingScripts/Plots/generalscript/DistinctPositions.rb:4:in`'

当我不使用
put memo
时,我不会得到错误,但也不会得到任何到终端的输出。如何获取所需内容?

为了在该上下文中使用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
下面是一个人为的例子来说明相同的错误和解决方案:

[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}

为了在这个上下文中使用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
下面是一个人为的例子来说明相同的错误和解决方案:

[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}

如果使用
inject
,块应始终在最后一行返回更新的
memo
。在您的情况下,在第二次迭代期间,memo等于最后一行,因此与put 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

如果使用
inject
,块应始终在最后一行返回更新的
memo
。在您的情况下,在第二次迭代期间,memo等于最后一行,因此与put 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

伟大的我知道这很简单。谢谢,或者只需使用一个更友好的
每个带有对象的\u
,它不需要返回备忘录:)太好了。我知道这很简单。感谢或只需使用一个更友好的
每个带有\u对象的\u
,不需要返回备忘录:)