home *** CD-ROM | disk | FTP | other *** search
-
- <HTML>
- <HEAD>
- <TITLE>constant - Perl pragma to declare constants</TITLE>
- <LINK REL="stylesheet" HREF="../Active.css" TYPE="text/css">
- <LINK REV="made" HREF="mailto:">
- </HEAD>
-
- <BODY>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> constant - Perl pragma to declare constants</P></STRONG>
- </TD></TR>
- </TABLE>
-
- <A NAME="__index__"></A>
- <!-- INDEX BEGIN -->
-
- <UL>
-
- <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
-
- <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
- <LI><A HREF="#description">DESCRIPTION</A></LI>
- <LI><A HREF="#notes">NOTES</A></LI>
- <LI><A HREF="#technical note">TECHNICAL NOTE</A></LI>
- <LI><A HREF="#bugs">BUGS</A></LI>
- <LI><A HREF="#author">AUTHOR</A></LI>
- <LI><A HREF="#copyright">COPYRIGHT</A></LI>
- </UL>
- <!-- INDEX END -->
-
- <HR>
- <P>
- <H1><A NAME="name">NAME</A></H1>
- <P>constant - Perl pragma to declare constants</P>
- <P>
- <HR>
- <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
- <UL>
- <LI>Linux</LI>
- <LI>Solaris</LI>
- <LI>Windows</LI>
- </UL>
- <HR>
- <H1><A NAME="synopsis">SYNOPSIS</A></H1>
- <PRE>
- use constant BUFFER_SIZE => 4096;
- use constant ONE_YEAR => 365.2425 * 24 * 60 * 60;
- use constant PI => 4 * atan2 1, 1;
- use constant DEBUGGING => 0;
- use constant ORACLE => 'oracle@cs.indiana.edu';
- use constant USERNAME => scalar getpwuid($<);
- use constant USERINFO => getpwuid($<);</PRE>
- <PRE>
- sub deg2rad { PI * $_[0] / 180 }</PRE>
- <PRE>
- print "This line does nothing" unless DEBUGGING;</PRE>
- <PRE>
- # references can be constants
- use constant CHASH => { foo => 42 };
- use constant CARRAY => [ 1,2,3,4 ];
- use constant CPSEUDOHASH => [ { foo => 1}, 42 ];
- use constant CCODE => sub { "bite $_[0]\n" };</PRE>
- <PRE>
- print CHASH->{foo};
- print CARRAY->[$i];
- print CPSEUDOHASH->{foo};
- print CCODE->("me");
- print CHASH->[10]; # compile-time error</PRE>
- <P>
- <HR>
- <H1><A NAME="description">DESCRIPTION</A></H1>
- <P>This will declare a symbol to be a constant with the given scalar
- or list value.</P>
- <P>When you declare a constant such as <CODE>PI</CODE> using the method shown
- above, each machine your script runs upon can have as many digits
- of accuracy as it can use. Also, your program will be easier to
- read, more likely to be maintained (and maintained correctly), and
- far less likely to send a space probe to the wrong planet because
- nobody noticed the one equation in which you wrote <CODE>3.14195</CODE>.</P>
- <P>
- <HR>
- <H1><A NAME="notes">NOTES</A></H1>
- <P>The value or values are evaluated in a list context. You may override
- this with <A HREF="../lib/Pod/perlfunc.html#item_scalar"><CODE>scalar</CODE></A> as shown above.</P>
- <P>These constants do not directly interpolate into double-quotish
- strings, although you may do so indirectly. (See <A HREF="../lib/Pod/perlref.html">the perlref manpage</A> for
- details about how this works.)</P>
- <PRE>
- print "The value of PI is @{[ PI ]}.\n";</PRE>
- <P>List constants are returned as lists, not as arrays.</P>
- <PRE>
- $homedir = USERINFO[7]; # WRONG
- $homedir = (USERINFO)[7]; # Right</PRE>
- <P>The use of all caps for constant names is merely a convention,
- although it is recommended in order to make constants stand out
- and to help avoid collisions with other barewords, keywords, and
- subroutine names. Constant names must begin with a letter or
- underscore. Names beginning with a double underscore are reserved. Some
- poor choices for names will generate warnings, if warnings are enabled at
- compile time.</P>
- <P>Constant symbols are package scoped (rather than block scoped, as
- <CODE>use strict</CODE> is). That is, you can refer to a constant from package
- Other as <CODE>Other::CONST</CODE>.</P>
- <P>As with all <A HREF="../lib/Pod/perlfunc.html#item_use"><CODE>use</CODE></A> directives, defining a constant happens at
- compile time. Thus, it's probably not correct to put a constant
- declaration inside of a conditional statement (like <CODE>if ($foo)
- { use constant ... }</CODE>).</P>
- <P>Omitting the value for a symbol gives it the value of <A HREF="../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> in
- a scalar context or the empty list, <CODE>()</CODE>, in a list context. This
- isn't so nice as it may sound, though, because in this case you
- must either quote the symbol name, or use a big arrow, (<CODE>=></CODE>),
- with nothing to point to. It is probably best to declare these
- explicitly.</P>
- <PRE>
- use constant UNICORNS => ();
- use constant LOGFILE => undef;</PRE>
- <P>The result from evaluating a list constant in a scalar context is
- not documented, and is <STRONG>not</STRONG> guaranteed to be any particular value
- in the future. In particular, you should not rely upon it being
- the number of elements in the list, especially since it is not
- <STRONG>necessarily</STRONG> that value in the current implementation.</P>
- <P>Magical values, tied values, and references can be made into
- constants at compile time, allowing for way cool stuff like this.
- (These error numbers aren't totally portable, alas.)</P>
- <PRE>
- use constant E2BIG => ($! = 7);
- print E2BIG, "\n"; # something like "Arg list too long"
- print 0+E2BIG, "\n"; # "7"</PRE>
- <P>Dereferencing constant references incorrectly (such as using an array
- subscript on a constant hash reference, or vice versa) will be trapped at
- compile time.</P>
- <P>In the rare case in which you need to discover at run time whether a
- particular constant has been declared via this module, you may use
- this function to examine the hash <CODE>%constant::declared</CODE>. If the given
- constant name does not include a package name, the current package is
- used.</P>
- <PRE>
- sub declared ($) {
- use constant 1.01; # don't omit this!
- my $name = shift;
- $name =~ s/^::/main::/;
- my $pkg = caller;
- my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
- $constant::declared{$full_name};
- }</PRE>
- <P>
- <HR>
- <H1><A NAME="technical note">TECHNICAL NOTE</A></H1>
- <P>In the current implementation, scalar constants are actually
- inlinable subroutines. As of version 5.004 of Perl, the appropriate
- scalar constant is inserted directly in place of some subroutine
- calls, thereby saving the overhead of a subroutine call. See
- <A HREF="../lib/Pod/perlsub.html#constant functions">Constant Functions in the perlsub manpage</A> for details about how and when this
- happens.</P>
- <P>
- <HR>
- <H1><A NAME="bugs">BUGS</A></H1>
- <P>In the current version of Perl, list constants are not inlined
- and some symbols may be redefined without generating a warning.</P>
- <P>It is not possible to have a subroutine or keyword with the same
- name as a constant in the same package. This is probably a Good Thing.</P>
- <P>A constant with a name in the list <CODE>STDIN STDOUT STDERR ARGV ARGVOUT
- ENV INC SIG</CODE> is not allowed anywhere but in package <CODE>main::</CODE>, for
- technical reasons.</P>
- <P>Even though a reference may be declared as a constant, the reference may
- point to data which may be changed, as this code shows.</P>
- <PRE>
- use constant CARRAY => [ 1,2,3,4 ];
- print CARRAY->[1];
- CARRAY->[1] = " be changed";
- print CARRAY->[1];</PRE>
- <P>Unlike constants in some languages, these cannot be overridden
- on the command line or via environment variables.</P>
- <P>You can get into trouble if you use constants in a context which
- automatically quotes barewords (as is true for any subroutine call).
- For example, you can't say <CODE>$hash{CONSTANT}</CODE> because <CODE>CONSTANT</CODE> will
- be interpreted as a string. Use <CODE>$hash{CONSTANT()}</CODE> or
- <CODE>$hash{+CONSTANT}</CODE> to prevent the bareword quoting mechanism from
- kicking in. Similarly, since the <CODE>=></CODE> operator quotes a bareword
- immediately to its left, you have to say <CODE>CONSTANT() => 'value'</CODE>
- (or simply use a comma in place of the big arrow) instead of
- <CODE>CONSTANT => 'value'</CODE>.</P>
- <P>
- <HR>
- <H1><A NAME="author">AUTHOR</A></H1>
- <P>Tom Phoenix, <<EM><A HREF="mailto:rootbeer@redcat.com">rootbeer@redcat.com</A></EM>>, with help from
- many other folks.</P>
- <P>
- <HR>
- <H1><A NAME="copyright">COPYRIGHT</A></H1>
- <P>Copyright (C) 1997, 1999 Tom Phoenix</P>
- <P>This module is free software; you can redistribute it or modify it
- under the same terms as Perl itself.</P>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> constant - Perl pragma to declare constants</P></STRONG>
- </TD></TR>
- </TABLE>
-
- </BODY>
-
- </HTML>
-