According to your description, the maximal value is at the end.
So, when you open the file to add a new record, seek back enough
and read the last number. Add one to that and store it next.
This example assumes that your record is at most 100
characters and that each record is white-space separated:
open(F,'myfile') or die;
$/='RECORD SEPARATOR';
seek F, -(101+length($/)), SEEK_END;
<F>;
while(<F>) { $max=(split)[-1]; }
print "New value can be ", $max+1, "\n";
(untested)
HTH | [reply] [d/l] |
Why are you storing a computed value into the file? Can you not make your "reading" algorithm just compute the line number upon read? That would seem more efficient, and less likely to get out of sync later.
-- Randal L. Schwartz, Perl hacker | [reply] |
Two options:
- Reserve a line in your file to store the 'next record number'. Increment this number for each record you add.
- You'll just have to read through the file and either:
- Parse each record, retrieve the record number, and keep track of the largest number you see. Increment and use that as your new record number. This is probably the safest approach.
- If you're guaranteed to have the same number of records as lines in the file (i.e. you won't be deleting lines without renumbering), you can just count the lines and add 1.
Either way, you're looking at potential problems if multiple processes attempt to update the file at the same time, so look into flock or some equivalent to be sure only one update is done at a time. | [reply] |
If you are using a database, most have some way to auto-increment
a number. Otherwise, you'll have to read in the number from your
previous entry, increment it by one (or whatever you are doing to
ensure a "unique" value), then write the new record. And you'll
have to carefully lock the file to make sure that nobody else
increments the number while you are using it.
| [reply] |
| [reply] |