Stefano Crocco
1/3/2008 7:37:00 PM
Alle gioved=C3=AC 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 =3D File.open("f3153013.eps") { |f| f.read(75) }
> =3D> "%!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.
> =3D> nil
> irb(main):007:0>
Because String#scan always returns an array, which is empty if there were n=
o=20
match, but which is always true. You should replace
if stuff.to_s.scan(...) then
with=20
unless stuff.to_s.scan(...).empty? then
If you only want to check whether stuff contains that substring, I think yo=
u=20
should use String#match, not String#scan. String#match returns an object of=
=20
class MatchData if there's a match and nil otherwise, which allows you to u=
se=20
the conditional like you did your code (check the ri documentation for=20
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 alre=
ady=20
a string?
I hope this helps
Stefano