Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re^2: how to create a constant file and use it in other file

by perlfan99 (Sexton)
on Jul 16, 2008 at 00:19 UTC ( [id://697832]=note: print w/replies, xml ) Need Help??


in reply to Re: how to create a constant file and use it in other file
in thread how to create a constant file and use it in other file

sorry i just forget that i put "use strict;" in "MyConst.pm" file, without that line, it works; with that line, i got the compile error.
  • Comment on Re^2: how to create a constant file and use it in other file

Replies are listed 'Best First'.
Re^3: how to create a constant file and use it in other file
by pc88mxer (Vicar) on Jul 16, 2008 at 00:24 UTC
    Then just add:
    our $const1;
    to MyConst.pm (just before the Readonly declaration.)

    Update: To use a variable in another package without requiring a prefix, you would have to import the symbol from the other package. The standard way to do this is to have MyConst be a subclass of Exporter.

      is there a way to export all constants instead of listing each one of them? and also a way to importing all of in another file?
        See the documentation for Exporter. Basically anything you list in @EXPORT_OK will be available for import by name into other modules which use the exporting module, and anything you list in @EXPORT will be imported automatically into useing modules. It's generally considered better style to use @EXPORT_OK, or to use a named tag in %EXPORT_TAGS, but if the whole purpose of your module is to provide constants @EXPORT may be OK.

        Your module might look something like this:

        package MyConst; use warnings; use strict; use base 'Exporter'; use vars qw(@EXPORT_OK %EXPORT_TAGS); @EXPORT_OK = qw($const1); %EXPORT_TAGS = (all => \@EXPORT_OK); # ...

        And the module using it would begin like this:

        use MyConst qw(:all);

        It took me a while but I finally got something that works as you want:

        ##### MyConst.pm ##### package MyConst; use warnings; use strict; use Readonly (); require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(); Readonly::Scalar our $const1 => 1; Readonly::Array our @array => qw(x y z); Readonly::Hash our %hash => (abc => 123, def => 456); sub foo { 'foobar' } my $package = __PACKAGE__; no strict 'refs'; while (my $sym = each %{ "$package\::" }) { # skip internals next if $sym =~ /^(?:BEGIN|EXPORT|ISA)$/; if (defined ${ $sym }) { push @EXPORT, "\$$sym"; } elsif (defined %{ $sym }) { push @EXPORT, "\%$sym"; } elsif (defined @{ $sym }) { push @EXPORT, "\@$sym"; } elsif (defined &{ $sym }) { push @EXPORT, "$sym"; } } 1; __END__

        Note 1: the position of our combined with Readonly is tricky. Using our Readonly::Scalar $const1 => 1 instead won't export $const1, but won't complain either.

        Note 2: be careful to not import any other symbols from other modules (e.g. Data::Dumper exports Dumper by default).

        ##### test.pl ##### # Uncomment to see Exporter's magic #BEGIN { $Exporter::Verbose = 1 } use MyConst; use Data::Dumper (); use strict; use warnings; print Data::Dumper->Dump([$const1, \@array, \%hash], [qw(*const1 *arra +y *hash)]), "\n"; print 'foo() = ', foo(), "\n"; __END__

        Thanks to Abigail's code referenced by zentara on Re: Listing the functions of a package / methods of an object.

        Update: There's a simpler method, which is to export a hash and make everything to be exported a member of that hash, so there's only 1 element to export.

Re^3: how to create a constant file and use it in other file
by perlfan99 (Sexton) on Jul 16, 2008 at 00:23 UTC
    oh, i am using perl v5.6.1

    can you use the constant data without prefixing it with the package name? ( $const1 instead of $MyConst::const1 )

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://697832]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (7)
As of 2024-04-23 16:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found