Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

File handling? How to make the better one?

by heatblazer (Scribe)
on Jun 11, 2012 at 14:01 UTC ( #975568=perlquestion: print w/ replies, xml ) Need Help??
heatblazer has asked for the wisdom of the Perl Monks concerning the following question:

Hello again!

I`ve actually managed to crete my serverside perl script for creating and/or overwriting an existing json file for my JSONP script. But my perl script is kinda weird. I had to open file 2 times, truncate it and the process looks not reliable... or it`s ok...

I need a quick review and an info if the script is good to go or it must undergo some maintenance.

#!/opt/lampp/bin/perl use strict; use CGI; ##### S U B S ######### sub speaker { my $text = shift; print "Content-type: text/html\n\n"; print $text; } sub makeJSON { #create and record a JSON file my ( $name, $mail, $pass ) = @_; if ( system("ls -l | grep datafile.json") == 0 ) { my $replace_me =""; #the storage for replace; my $jobj = "\n \t\t{ \"name\":\t\"$name\",\n\t\t\"mail\":\t\"$ +mail\",\n\t\t\"pass\":\t\"$pass\",\n\t\t },\n];"; open (FH, "</opt/lampp/htdocs/datafile.json") or die("can`t op +en filehandle: $!\n"); while ( <FH> ) { if ( /\]/ ) { $replace_me .= $jobj; } else { $replace_me .= $_; } } close(FH); #truncate and create again open (FR, ">/opt/lampp/htdocs/datafile.json") or die("can`t op +en filehandle: $!\n"); print FR $replace_me; close(FR); } else { my $jobj = "var user = [ \n\t\t{ \"name\":\t\"$name\",\n\t\t\" +mail\":\t\"$mail\",\n\t\t\"pass\":\t\"$pass\",\n\t\t },\n];"; open (FH, ">/opt/lampp/htdocs/datafile.json") or die("can`t op +en filehandle: $!\n"); print FH $jobj; close(FH); } print "Content-type: text/html\n\n"; print "<p>Finished file</p>"; } ################################################## my $q = CGI->new(); my ($name, $mail, $pass) = ( $q->param('name'), $q->param('mail'), $q->param('pass'), ); makeJSON($name, $mail, $pass);

THanks in advance

Comment on File handling? How to make the better one?
Download Code
Re: File handling? How to make the better one?
by tobyink (Abbot) on Jun 11, 2012 at 15:08 UTC
    if ( system("ls -l | grep datafile.json") == 0 ) {

    Sweet Jesus! Is this you trying to check whether a file exists?! You know Perl does have built-ins for checking the existence of a file...

    if (-f "datafile.json") {

    Using a few commodity modules from CPAN, you can make your life a lot easier...

    #!/opt/lampp/bin/perl use strict; use CGI; use CGI::Carp 'fatalsToBrowser'; use File::Slurp qw< read_file write_file >; use JSON qw< from_json to_json >; use constant USER_ACCOUNT_FILE => '/opt/lampp/htdocs/datafile.json'; sub store_user_account { my ($name, $mail, $pass) = @_; my $existing_data = -f USER_ACCOUNT_FILE ? from_json(scalar read_file(USER_ACCOUNT_FILE, err_mode => 'c +roak')) : []; push @$existing_data, { name => $name, mail => $mail, pass => $pass, }; write_file( USER_ACCOUNT_FILE, { atomic => 1, err_mode => 'croak' }, to_json($existing_data), ); } sub process_cgi { my ($q) = @_; store_user_account( map { scalar $q->param($_) } qw(name mail pass), ); print $q->header('text/html'); print "<p>Finished file.</p>\n"; } process_cgi( CGI->new );
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

      Thanks, I don`t know all these tricks. I`ll most definitely look upon that JSON module too. Looks like it will make my life better.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://975568]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (10)
As of 2014-08-21 20:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (143 votes), past polls