I can't see anything obviously wrong with your code, so the problem must be somewhere else in your environment. Can you post a (short) example of a program which uses this package and exhibits the problem you're describing.
A couple of minor code review notes:
package wslib;
The Perl convention is to reserve lower case package names for pragmas (like 'warnings' and 'strict'). You should rename this to something like "WSLib".
open PAGE, "$data_reg"
There's no need for the quotes there. In fact it is sometimes a really bad idea.
| [reply] [d/l] [select] |
Thanks for the general tips, I apologise for the delay in replying - I have been trying to synthesise the salient parts or the script
In fact I have isolated what is causing the problem, but I'm not sure why or how I should change things to do what I want.
The background is that several scripts are accessed by a single user by way of a 'work page', containing buttons for those scripts.
When a script is finished with it uses wslib ( soon to be WSLib(!! :) ) to create a new work page, using html::template (not shown to keep the example simple.
In this particular instance the script edits the text file $data_reg called up in sub workspace, and renames it. If I comment out the rename line, sub workspace prints out the whole file, if I leave it in it only prints three quarters of it!! How should I deal with this?
sub edit {
my $newline = join "\t", ($count_in,$current_time_in,$user_in,$passwo
+rd_in,$email_in,$web_in,$agencyname_in,$business_in,$country_code_in,
+$mobile_no_in,$sec_email_in,$skip);
open FH, "$data_reg" or die "Can't open data_reg file for reading: $!
+";
flock (FH, 1) or die "Can't lock data_reg file for reading";
my @alldata = <FH>;
close FH;
open FILE, '>', "$data_reg.tmp" or die "Can't open data_reg file for
+reading: $!";
flock (FILE, 2) or die "Can't lock data_reg.tmp file for writing";
foreach (@alldata) {
chomp;
($count,$current_time,$username,$password,$email,$web,$agencyname,
+$business,$country_code,$mobile_no,$sec_email,$skip) = split /\t/;
if ($user_in eq $username) {
print FILE "$newline\n";
} else {
print FILE "$_\n";
}
}
# rename ("$data_reg.tmp", "$data_reg") or die "Can't rename file: $!
+"; ##only prints properly if commented out!
&workspace(@exp);
}
| [reply] [d/l] |
Close the FILE filehandle before you do the rename. Until you close the filehandle, some of the output will be buffered and won't have been written to the disk file. Closing the filehandle will flush the buggered data to disk.
As frodo72 pointed out, you are Suffering from Buffering.
| [reply] |
It seems to be Dominus day today... even if it's Tuesday! Regarding this fragment:
open FILE, '>', "$data_reg.tmp" or die "Can't open data_reg file for
+reading: $
+!";
flock (FILE, 2) or die "Can't lock data_reg.tmp file for writing";
you might benefit from these slides.
Flavio
perl -ple'$_=reverse' <<<ti.xittelop@oivalf
Don't fool yourself.
| [reply] [d/l] |
I'd suggest using In direct Filehandles for situations like this. Also by shifting off the first parameter, the function is slightly more useful, you can call the function with any filename you wish, workspace( '/root_to_file' );
package wslib;
use strict;
our @EXPORT = qw( workspace ); #place all the variables you want to ex
+port by default in here (c.f. @EXPORT_OK)
use Exporter;
our @ISA = qw(Exporter);
sub workspace {
my $data_reg = shift || return;
open my $page, "$data_reg" or die "Cant open $data_reg: $!";
while (my $line = <$page>) {
print "$line<br>";
}
close $page;
}
1;
| [reply] [d/l] |
Thanks for that info - I hadn't come across it before and it looks very useful. I'm definitely a convert!!
| [reply] |
| [reply] |
| [reply] |