Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"


by root (Scribe)
on Dec 23, 1999 at 00:49 UTC ( #1138=perlfunc: print w/replies, xml ) Need Help??


See the current Perl documentation for lib:fields.

Here is our local, out-dated (pre-5.6) version:

fields - compile-time class fields

        package Foo;
        use fields qw(foo bar _private);
    my Foo $var = new Foo;
    $var->{foo} = 42;

    # This will generate a compile-time error.
    $var->{zap} = 42;



The fields pragma enables compile-time verified class fields. It does so by updating the %FIELDS hash in the calling package.

If a typed lexical variable holding a reference is used to access a hash element and the %FIELDS hash of the given type exists, then the operation is turned into an array access at compile time. The %FIELDS hash map from hash element names to the array indices. If the hash element is not present in the %FIELDS hash, then a compile-time error is signaled.

Since the %FIELDS hash is used at compile-time, it must be set up at compile-time too. This is made easier with the help of the 'fields' and the 'base' pragma modules. The 'base' pragma will copy fields from base classes and the 'fields' pragma adds new fields. Field names that start with an underscore character are made private to a class and are not visible to subclasses. Inherited fields can be overridden but will generate a warning if used together with the -w switch.

The effect of all this is that you can have objects with named fields which are as compact and as fast arrays to access. This only works as long as the objects are accessed through properly typed variables. For untyped access to work you have to make sure that a reference to the proper %FIELDS hash is assigned to the 0'th element of the array object (so that the objects can be treated like an pseudo-hash). A constructor like this does the job:

  sub new
      my $class = shift;
      no strict 'refs';
      my $self = bless [\%{"$class\::FIELDS"], $class;


base, perlref

Log In?

What's my password?
Create A New User
[LanX]: I want to author a new module for CPAN w/o complicated build structure
[LanX]: ther is also Dist::Zilla :-/
[LanX]: How to make a CPAN Module Distribution from 2002
[Your Mother]: Dist::Zilla is kind of the nuclear option. I set it up back in the day but it's really targeted at authors who are managing MANY modules and want to automate everything.
[erix]: perlancar should know ;)
[LanX]: see warning
[Your Mother]: Thanks for the warning notice.
[LanX]: :p
[LanX]: confusing sh+t
[Your Mother]: Yes.

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (7)
As of 2017-08-18 17:45 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (306 votes). Check out past polls.