From: Tris Hoar Date: 2012-03-06T19:36:54+09:00 Subject: Re: Inconsistent behaviour when working with a string On 06/03/2012 09:42, Robert Klemme wrote: > 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 Thank you, that makes a lot of sense, I'd even noticed the . and .. directory pointers earlier on and knew I'd need to do something about them, but for some reason it did not occur that this was the cause of the issue I was having at the out set. Best regards, Tris ************************************************************* This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed. If you have received this email in error please notify postmaster@bgfl.org The views expressed within this email are those of the individual, and not necessarily those of the organisation *************************************************************