develooper Front page | perl.beginners | Postings from February 2009

2 files, 1 package, shared constants

Thread Next
From:
Stanisław T. Findeisen
Date:
February 25, 2009 02:44
Subject:
2 files, 1 package, shared constants
Message ID:
49A52013.1080806@students.mimuw.edu.pl
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello there

My application consists of several files. Some of them are to be run as
CGI scripts, the others from command line. There is also a "common" file
with constants and shared routines.

The question is: what is the most standard way to export constants from
that common file so that they could be used in the other files?

Here is a minimal example:

- -------- one.pl --------
package MyPackage;

use warnings;
use strict;

use constant {
~    MY_FIRST_CONSTANT => 'hello world!'
};

*MY_SECOND_CONSTANT = [1, 3, 7];
*MY_SECOND_CONSTANT = \729;

sub routine1 {
~    print "Hello from routine1! $MyPackage::MY_SECOND_CONSTANT\n";
}

# This is to satisfy require()
1;

- -------- two.pl --------
package MyPackage;

use warnings;
use strict;

require 'one.pl';

print 'The 1st constant is: ' . MyPackage->MY_FIRST_CONSTANT . "\n";
print 'The 2nd constant is: ' . *MY_SECOND_CONSTANT . "\n";
print '             SCALAR: ' . ${*MY_SECOND_CONSTANT{SCALAR}} . "\n";
print '              ARRAY: ' . join(', ',
@{*MY_SECOND_CONSTANT{ARRAY}}) . "\n";

MyPackage->routine1;

- ----------------

This produces output like this:

$ perl ./two.pl
The 1st constant is: hello world!
The 2nd constant is: *MyPackage::MY_SECOND_CONSTANT
~             SCALAR: 729
~              ARRAY: 1, 3, 7
Hello from routine1! 729

Funny thing is that in two.pl MyPackage->MY_FIRST_CONSTANT works, but
neither of these:

print '' . MY_FIRST_CONSTANT . "\n";
print '' . MyPackage::MY_FIRST_CONSTANT . "\n";

Bareword "MY_FIRST_CONSTANT" not allowed while "strict subs" in use at
./two.pl line ***.
Execution of ./two.pl aborted due to compilation errors.

So I suspect that although I managed to solve the problem, the solution
with MyPackage->MY_FIRST_CONSTANT is a bug in Perl or something?? Why
should I be able to call the constant subroutine, but not be able to
refer to the constant "as is"??

Why should I even bother with all these, since I am using only 1 package
MyPackage? The documentation says package is namespace is symbol table.
Why does MY_FIRST_CONSTANT work "as is" in one.pl, and not in two.pl?

I am using Perl v5.8.8.

STF

=======================================================================
http://eisenbits.homelinux.net/~stf/ . My PGP key fingerprint is:
9D25 3D89 75F1 DF1D F434  25D7 E87F A1B9 B80F 8062
=======================================================================
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iD8DBQFJpSAQ6H+hubgPgGIRAoYHAJ4uRiGGwlAbjB3whHx8nDOZCN58QwCdHZTA
Y7Anj2S1iXe93mES2d19REY=
=iwf7
-----END PGP SIGNATURE-----

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About