无法让 Ruby foreach 或 glob 与 ARGV 一起工作......或根本无法工作
Can't get Ruby foreach or glob to work with ARGV... or at all
我正在使用 taglib-ruby 来查看您每天可以听多少次歌曲。我让它适用于单首歌曲,但现在我正在尝试对其进行修复,以便它可以循环遍历目录并吐出每首歌曲的时长以及每天可以收听的次数。它在运行时不会抛出错误,但也不会输出任何内容。我不认为它出于某种原因看到了这些文件。我尝试使用 foreach 并不断收到这样的错误消息:
$ ruby songtime.rb /media/ab/storage/Music/Between\ the\ Buried\ and\ Me/[2007]\ Colors/
songtime.rb:9:in `block (2 levels) in <main>': undefined method `length' for nil:NilClass (NoMethodError)
from /home/ab/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/taglib-ruby-0.7.0/lib/taglib/base.rb:8:in `open'
from songtime.rb:7:in `block in <main>'
from songtime.rb:4:in `foreach'
from songtime.rb:4:in `<main>'
如果我只是将目录名称硬编码到程序中,也会出现同样的问题,类似于:
#!/usr/bin/ruby
require "taglib"
Dir.foreach(ARGV[0]) do |songfile|
next if songfile == '.' or songfile == '..'
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{(24*60*60/songLength * 1000).floor / 1000.0} times per day."
end
end
所以我尝试切换到 glob:
#!/usr/bin/ruby
require "taglib"
Dir.glob("#{ARGV[0]}*.mp3") do |songfile|
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{(24*60*60/songLength * 1000).floor / 1000.0} times per day."
end
end
这是行不通的。没有错误消息,但没有打印任何内容。如果我放
它也不起作用
#!/usr/bin/ruby
require "taglib"
Dir.glob("/media/ab/storage/Music/Between the Buried and Me/[2007] Colors/*.mp3") do |songfile|
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{24*60*60/songLength} times per day."
end
end
受够了吗?对不起,我是菜鸟菜鸟。
两件事。
1) Dir.glob 想要一个类似于 shell 上使用的 glob 字符串。像 Dir.glob("*.mp3")
或子目录 Dir.glob("**/*.mp3")
.
2) 在上一个示例中,您实际上并没有调用循环。当循环遍历一个数组(你正在做的)时,你需要使用 'each' 方法。
Dir.glob("*.mp3").each do |filename|
...
end
否则,您会将块(do 和 end 之间的代码)传递给方法,而不是循环方法 each
。
查看:http://ruby-doc.org//core-2.2.0/Array.html 了解可应用于数组的各个方法。
Dir 会自动从程序本身所在的路径开始...所以当我做 /media/ab...等时,它实际上是在做 Code/Ruby/ab/media 等(不存在)。
我更改了程序,这是工作版本。
#!/usr/bin/ruby
require "taglib"
Dir.chdir(ARGV[0])
Dir.foreach(Dir.pwd) do |songfile|
next if songfile == '.' or songfile == '..' or songfile !~ /[\s\S]*.mp3/
puts songfile
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{24*60*60/songLength} times per day."
puts ""
end
end
我正在使用 taglib-ruby 来查看您每天可以听多少次歌曲。我让它适用于单首歌曲,但现在我正在尝试对其进行修复,以便它可以循环遍历目录并吐出每首歌曲的时长以及每天可以收听的次数。它在运行时不会抛出错误,但也不会输出任何内容。我不认为它出于某种原因看到了这些文件。我尝试使用 foreach 并不断收到这样的错误消息:
$ ruby songtime.rb /media/ab/storage/Music/Between\ the\ Buried\ and\ Me/[2007]\ Colors/
songtime.rb:9:in `block (2 levels) in <main>': undefined method `length' for nil:NilClass (NoMethodError)
from /home/ab/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/taglib-ruby-0.7.0/lib/taglib/base.rb:8:in `open'
from songtime.rb:7:in `block in <main>'
from songtime.rb:4:in `foreach'
from songtime.rb:4:in `<main>'
如果我只是将目录名称硬编码到程序中,也会出现同样的问题,类似于:
#!/usr/bin/ruby
require "taglib"
Dir.foreach(ARGV[0]) do |songfile|
next if songfile == '.' or songfile == '..'
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{(24*60*60/songLength * 1000).floor / 1000.0} times per day."
end
end
所以我尝试切换到 glob:
#!/usr/bin/ruby
require "taglib"
Dir.glob("#{ARGV[0]}*.mp3") do |songfile|
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{(24*60*60/songLength * 1000).floor / 1000.0} times per day."
end
end
这是行不通的。没有错误消息,但没有打印任何内容。如果我放
它也不起作用#!/usr/bin/ruby
require "taglib"
Dir.glob("/media/ab/storage/Music/Between the Buried and Me/[2007] Colors/*.mp3") do |songfile|
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{24*60*60/songLength} times per day."
end
end
受够了吗?对不起,我是菜鸟菜鸟。
两件事。
1) Dir.glob 想要一个类似于 shell 上使用的 glob 字符串。像 Dir.glob("*.mp3")
或子目录 Dir.glob("**/*.mp3")
.
2) 在上一个示例中,您实际上并没有调用循环。当循环遍历一个数组(你正在做的)时,你需要使用 'each' 方法。
Dir.glob("*.mp3").each do |filename|
...
end
否则,您会将块(do 和 end 之间的代码)传递给方法,而不是循环方法 each
。
查看:http://ruby-doc.org//core-2.2.0/Array.html 了解可应用于数组的各个方法。
Dir 会自动从程序本身所在的路径开始...所以当我做 /media/ab...等时,它实际上是在做 Code/Ruby/ab/media 等(不存在)。
我更改了程序,这是工作版本。
#!/usr/bin/ruby
require "taglib"
Dir.chdir(ARGV[0])
Dir.foreach(Dir.pwd) do |songfile|
next if songfile == '.' or songfile == '..' or songfile !~ /[\s\S]*.mp3/
puts songfile
TagLib::FileRef.open(songfile) do |mp3|
properties = mp3.audio_properties
songLength = properties.length
puts "Song length is #{songLength}"
puts "You can listen to this song #{24*60*60/songLength} times per day."
puts ""
end
end