Solved

Use of constant to open a file - not working!

Posted on 2007-12-01
4
192 Views
Last Modified: 2010-03-05
I get an error in my code when trying to use the ACTIVE_LOG2 (code failure on the open line). Why doesn't this work, or how can I use a constant for opening files? As the code shows I was able to use the READONLY module constant without any problems.
# Usage      : First need to manually create the temp.log and temp2.log files

# Purpose    :   Shows how to open files with 2 or with 3 arguments.

# Returns    : no change to temp.log and temp2.log because they are input only

#  the perm.log and perm2.log files are created and overwritten each time

# the program is run

# Parameters :

# comments: Best Practices recommends the 3 argument method for clarity,

# but other books say to use the 2 argument for backwards compatiblity
 

# See Perl Best Practices pg 55 for info on the Readonly module

# Summarized here: better alternative to using keyword constant

use Readonly;       #I had to use PPM to install this module

use Carp;           #included with Perl, need this for the croak function

#example had >temp.log but this is not a valid name for windows

Readonly my $ACTIVE_LOG1 => 'temp.log';

Readonly my $STATIC_LOG1 => 'perm.log';

use constant ACTIVE_LOG2 => 'temp2.log';

use constant STATIC_LOG2 => 'perm2.log';
 

#open modes

# < input only

# > output only

# >> open in append mode

# +< r/w update access

# +> w/r update access

# +>> read append
 

# Intention is to .... 	open temp.log for input only

# 						open perm.log for output/overwriting only

open my $active1, "<$ACTIVE_LOG1" or croak "Can't open '$ACTIVE_LOG1': $!";

open my $static1, ">$STATIC_LOG1" or croak "Can't open '$STATIC_LOG1': $!";
 
 

# Here is the 3 argument open

open my $active2, '<', "ACTIVE_LOG2" or croak "Can't open 'ACTIVE_LOG2'";

open my $static2, '>', "STATIC_LOG2" or croak "Can't open 'STATIC_LOG2'";
 
 

print $active1 "active1 line 1a";

print $static1 "static1 line 1b";

print $active2 "active2 line 1a";

print $static2 "static2 line 1b";

Open in new window

0
Comment
Question by:lqwest
  • 3
4 Comments
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
The exact working of the error message would be helpfull.

EVERY perl script you write should include these 2 pragmas.
use strict;
use warnings;

The problem is that you're trying to open a file fore reading that doesn't exist.
0
 
LVL 28

Assisted Solution

by:FishMonger
FishMonger earned 50 total points
Comment Utility
I forgot to mention, you need to remove the quotes around the constants in the open call.
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
Run this updated version and fix the errors that it points out.
#!/usr/bin/perl
 

use strict;

use warnings;

use Data::Dumper;
 

# Usage      : First need to manually create the temp.log and temp2.log files

# Purpose    :   Shows how to open files with 2 or with 3 arguments.

# Returns    : no change to temp.log and temp2.log because they are input only

#  the perm.log and perm2.log files are created and overwritten each time

# the program is run

# Parameters :

# comments: Best Practices recommends the 3 argument method for clarity,

# but other books say to use the 2 argument for backwards compatiblity

 

# See Perl Best Practices pg 55 for info on the Readonly module

# Summarized here: better alternative to using keyword constant

use Readonly;       #I had to use PPM to install this module

use Carp;           #included with Perl, need this for the croak function

#example had >temp.log but this is not a valid name for windows

Readonly my $ACTIVE_LOG1 => 'temp.log';

Readonly my $STATIC_LOG1 => 'perm.log';

use constant ACTIVE_LOG2 => 'temp2.log';

use constant STATIC_LOG2 => 'perm2.log';
 

print Dumper "ACTIVE_LOG2", ACTIVE_LOG2;
 

#open modes

# < input only

# > output only

# >> open in append mode

# +< r/w update access

# +> w/r update access

# +>> read append

 

# Intention is to ....  open temp.log for input only

#                                               open perm.log for output/overwriting only

open my $active1, "<$ACTIVE_LOG1" or croak "Can't open '$ACTIVE_LOG1': $!";

open my $static1, ">$STATIC_LOG1" or croak "Can't open '$STATIC_LOG1': $!";

 

 

# Here is the 3 argument open

open my $active2, '<', "ACTIVE_LOG2" or croak "Can't open 'ACTIVE_LOG2'";

open my $static2, '>', STATIC_LOG2 or croak "Can't open 'STATIC_LOG2'";

 

 

print $active1 "active1 line 1a";

print $static1 "static1 line 1b";

print $active2 "active2 line 1a";

print $static2 "static2 line 1b";

Open in new window

0
 
LVL 39

Accepted Solution

by:
Adam314 earned 75 total points
Comment Utility
When you put quotes around a constant, it is looking for a file named "ACTIVE_LOG2", instead of what is in the constant.  
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Email validation in proper way is  very important validation required in any web pages. This code is self explainable except that Regular Expression which I used for pattern matching. I originally published as a thread on my website : http://www…
In the distant past (last year) I hacked together a little toy that would allow a couple of Manager types to query, preview, and extract data from a number of MongoDB instances, to their tool of choice: Excel (http://dilbert.com/strips/comic/2007-08…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now