• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 218
  • Last Modified:

Use of constant to open a file - not working!

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
lqwest
Asked:
lqwest
  • 3
2 Solutions
 
FishMongerCommented:
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
 
FishMongerCommented:
I forgot to mention, you need to remove the quotes around the constants in the open call.
0
 
FishMongerCommented:
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
 
Adam314Commented:
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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now