NAME

Readonly - Facility for creating read-only scalars, arrays, hashes.

VERSION

This documentation describes version 0.05 of Readonly.pm, March 15, 2002.

SYNOPSIS

use Readonly;

# Read-only scalar
Readonly::Scalar     $sca => $initial_value;
Readonly::Scalar  my $sca => $initial_value;

# Read-only array
Readonly::Array      @arr => @values;
Readonly::Array   my @arr => @values;

# Read-only hash
Readonly::Hash       %has => (key => value, key => value, ...);
Readonly::Hash    my %has => (key => value, key => value, ...);
# or:
Readonly::Hash       %has => {key => value, key => value, ...};

# You can use the read-only variables like any regular variables:
print $sca;
$something = $sca + $arr[2];
next if $has{$some_key};

# But if you try to modify a value, your program will die:
$sca = 7;            # "Attempt to modify readonly scalar"
push @arr, 'seven';  # "Attempt to modify readonly array"
delete $has{key};    # "Attempt to modify readonly hash"

DESCRIPTION

This is a facility for creating non-modifiable variables. This is useful for configuration files, headers, etc.

COMPARISON WITH "use constant" OR TYPEGLOB CONSTANTS

  • Perl provides a facility for creating constant scalars, via the "use constant" pragma. That built-in pragma creates only scalars and lists; it creates variables that have no leading $ character and which cannot be interpolated into strings. It works only at compile time. You cannot take references to these constants.

  • Another popular way to create read-only scalars is to modify the symbol table entry for the variable by using a typeglob:

    *a = \"value";

    This works fine, but it only works for global variables ("my" variables have no symbol table entry). Also, the following similar constructs do not work:

    *a = [1, 2, 3];      # Does NOT create a read-only array
    *a = { a => 'A'};    # Does NOT create a read-only hash
  • Readonly.pm, on the other hand, will work with global variables and with lexical ("my") variables. It will create scalars, arrays, or hashes, all of which look and work like normal, read-write Perl variables. You can use them in scalar context, in list context; you can take references to them, pass them to functions, anything.

    However, Readonly.pm does impose a performance penalty. This is probably not an issue for most configuration variables. But benchmark your program if it might be.

FUNCTIONS

Readonly::Scalar $var => $value;

Creates a nonmodifiable scalar, $var, and assigns a value of $value to it. Thereafter, its value may not be changed. Any attempt to modify the value will cause your program to die.

A value must be supplied. If you want the variable to have undef as its value, you must specify undef.

Readonly::Array @arr => (value, value, ...);

Creates a nonmodifiable array, @arr, and assigns the specified list of values to it. Thereafter, none of its values may be changed; the array may not be lengthened or shortened or spliced. Any attempt to do so will cause your program to die.

Readonly::Hash %h => (key => value, key => value, ...);
Readonly::Hash %h => {key => value, key => value, ...};

Creates a nonmodifiable hash, %h, and assigns the specified keys and values to it. Thereafter, its keys or values may not be changed. Any attempt to do so will cause your program to die.

A list of keys and values may be specified (with parentheses in the synopsis above), or a hash reference may be specified (curly braces in the synopsis above). If a list is specified, it must have an even number of elements, or the function will die.

EXAMPLES

# SCALARS: 

# A plain old read-only value
Readonly::Scalar $a => "A string value";

# The value need not be a compile-time constant:
Readonly::Scalar $a => $computed_value;


# ARRAYS:

# A read-only array:
Readonly::Array @a => (1, 2, 3, 4);

# The parentheses are optional:
Readonly::Array @a => 1, 2, 3, 4;

# You can use Perl's built-in array quoting syntax:
Readonly::Array @a => qw/1 2 3 4/;

# You can initialize a read-only array from a variable one:
Readonly::Array @a => @computed_values;

# A read-only array can be empty, too:
Readonly::Array @a => ();
Readonly::Array @a;        # equivalent


# HASHES

# Typical usage:
Readonly::Hash %a => (key1 => 'value1', key2 => 'value2');

# A read-only hash can be initialized from a variable one:
Readonly::Hash %a => %computed_values;

# A read-only hash can be empty:
Readonly::Hash %a => ();
Readonly::Hash %a;        # equivalent

# If you pass an odd number of values, the program will die:
Readonly::Hash %a => (key1 => 'value1', "value2");
    --> dies with "May not store an odd number of values in a hash"

EXPORTS

By default, this module exports no symbols into the calling program's namespace. The following symbols are available for import into your program, if you like:

Scalar
Array
Hash

REQUIREMENTS

Perl 5.005
Carp.pm (included with Perl)
Exporter.pm (included with Perl)

AUTHOR / COPYRIGHT

Eric J. Roode, eric@myxa.com

Copyright (c) 2001-2002 by Eric J. Roode. All Rights Reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

If you have suggestions for improvement, please drop me a line. If you make improvements to this software, I ask that you please send me a copy of your changes. Thanks.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 327:

=back doesn't take any parameters, but you said =back 1