From: Robert Klemme Date: 2012-03-06T18:42:29+09:00 Subject: Re: Inconsistent behaviour when working with a string Jan E. wrote in post #1050236: > Hi, > > The Dir.foreach iterator always begins with the current directory '.' > and the parent directory '..'. If you don't skip these cases, the > iterator will throw an error on the first run: > > If file is '.', then file[/\d{10,}/] is nil (there aren't any digits). > And if fileint is nil, then fileint[0,2] will fail, because nil doesnt > have a [] method. > > You should generally check the file parameter before processing it. > Otherwise, you will always run into trouble if there are any entries > that don't match the pattern. > > For example, you could write > > Dir.foreach(".") do |file| > if file =~ /access(?:_denied)?(\d+)\.merged\.log\.bz2/ > timestamp = $1 > year, month = > timestamp[0, 2], month[2, 2] > month = $months[month.to_i - 1] > puts "year = #{year} month = #{month} and file was #{file}" > end > end Absolutely! I'd go just a bit further and make the matching more rigorous and also extract all relevant data in one go: Dir.foreach(dir) do |file| if file =~ /\Aaccess(?:_denied)?(\d{2})(\d{2})\d{6}\.merged\.log\.bz2\z/ year = $1.to_i month = $2.to_i puts "year = #{year} month = #{$months[month - 1]} and file was #{file}" end end Note: if there is a hierarchy of folders then also Find.find or Pathname.find could be used. Kind regards robert -- Posted via http://www.ruby-forum.com/.