From: Stefano Crocco Date: 2008-01-04T04:37:06+09:00 Subject: Re: Why doesn't this file read work for me? Alle giovedì 3 gennaio 2008, Peter Bailey ha scritto: > Hi, > I need to open files, just the first 75 bytes of them, and determine if > there's a string in the data. If the string is there, then, I do > something. If not, then I do something else. > > Here's my IRB try. I don't understand why it's coming back to me with a > positive, meaning, it seems to see the string, when, the string > definitely isn't in the file. > > Thanks, > Peter > > > L:\eps\fedreg>irb > irb(main):001:0> stuff = File.open("f3153013.eps") { |f| f.read(75) } > => "%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox: 0 0 552 > 704\n%%HiResBoundingBox: 0.00" > irb(main):002:0> if stuff.to_s.scan(/^\%\%Creator: MathType/) then > irb(main):003:1* puts "MathType file." > irb(main):004:1> else > irb(main):005:1* puts "NOT MathType file." > irb(main):006:1> end > mathtype file. > => nil > irb(main):007:0> Because String#scan always returns an array, which is empty if there were no match, but which is always true. You should replace if stuff.to_s.scan(...) then with unless stuff.to_s.scan(...).empty? then If you only want to check whether stuff contains that substring, I think you should use String#match, not String#scan. String#match returns an object of class MatchData if there's a match and nil otherwise, which allows you to use the conditional like you did your code (check the ri documentation for String#scan and String#match for more details). By the way, why do you call to_s on the result of File.open ? Isn't it already a string? I hope this helps Stefano