Why am I getting this string error?

Can someone explain to me why I’m getting the error below for this part
of a script? It doesn’t seem to like line 24, the scan line, but, I’ve
got this same code being used for other needs and it doesn’t complain at
all there.

Thanks,
Peter

…
20 Dir.glob(".ps").each do |psfile|
21 $filetime = File.ctime(psfile)
22 $filetime = $filetime.to_s.gsub!(/ -.
$/, “”)
23 file_contents = File.read(psfile)
24 file_contents.scan(/%%Pages: (\d{1,5})[ ]+\n/) do
25 totalpages = $1
26 if (totalpages.to_i % 2) !=0 then
27 totalpages = totalpages.to_i + 1
28 file_contents << “%%Blank page for Asura.\n%%Page:
29 #{totalpages.to_i}\nshowpage\n”
30 File.open(psfile, “w”) { |f| f.print file_contents }
31 FileUtils.touch(psfile)
32 end
…

getting this error:

rubyw indexpagecounts_6x9.rbw
indexpagecounts_6x9.rbw:24:in scan': string modified (RuntimeError) from indexpagecounts_6x9.rbw:24 from indexpagecounts_6x9.rbw:20:ineach’
from indexpagecounts_6x9.rbw:20
Exit code: 1

Peter B. wrote:

Can someone explain to me why I’m getting the error below for this part
of a script? It doesn’t seem to like line 24, the scan line, but, I’ve
got this same code being used for other needs and it doesn’t complain at
all there.

from indexpagecounts_6x9.rbw:24
from indexpagecounts_6x9.rbw:20:in `each’
from indexpagecounts_6x9.rbw:20

Exit code: 1

You’re modifying file_contents during scan, so scan gets confused.
from what I see, you’d better use gsub! with a block, since, if I
understood your point, you are basically inserting text where you detect
something.

Vince

…
20 Dir.glob(".ps").each do |psfile|
21 $filetime = File.ctime(psfile)
22 $filetime = $filetime.to_s.gsub!(/ -.
$/, “”)
23 file_contents = File.read(psfile)
24 file_contents.scan(/%%Pages: (\d{1,5})[ ]+\n/) do
25 totalpages = $1
26 if (totalpages.to_i % 2) !=0 then
27 totalpages = totalpages.to_i + 1
28 file_contents. << “%%Blank page for Asura.\n%%Page:
29 #{totalpages.to_i}\nshowpage\n”
30 File.open(psfile, “w”) { |f| f.print file_contents }
31 FileUtils.touch(psfile)
32 end
…

You’re modifying file_contents during scan, so scan gets confused.
from what I see, you’d better use gsub! with a block, since, if I
understood your point, you are basically inserting text where you detect
something.

Vince

Thanks, Vince. I see what you mean, and, I did change it to use a gsub!.
I’ve always thought of gsub as a changer for little things, not huge
files like this, but, it works fine. Thanks again.