in reply to Reading the script code from itself

Padewan ... draw thee near.

What I need is to get the list of defined constants to make their names exportable ...

No.   That is your now-chosen implementation, and it is spinning way off-course from any accepted or acceptable norm of how to use constants in Perl.   If such a contraption ever made it into production anywhere, you must not wonder why your fellow developers would be lobbing bricks into your cube from high altitudes at such times when they know that you are present therein.   Step back, and tell us ... not what you are trying to write (which is clear enough, and smelly enough ...) but what you are trying to achieve.   Let us say:   “Tell us more about the piece(s) of software that are going to be using this.   Tell us more about what they need to achieve.”

Let me kindly put it this way:   if I were your project-manager, or your team lead, I would order you to nix this idea, whatever it is, and I would circle-back to see that it had been done.   I do not fully understand it, but I understand it already well-enough to know that it is ... a mistake.   That, in a world of “there’s more than one way to do it,” this cannot be The Way.   Therefore, I would trust my gut and exercise my authority, and invite you to understand and come to agree.

Knowing that I once-again risk a hailstorm of down-votes, I hope that you instead will not take this frank assessment personally.   Step far-enough back from your problem so that you can see it outside of your present “solution.”   You do not want to be where you are, wherever it is.   I may not understand your total requirement well enough (yet) to know what is right, but my gut is telling me quite clearly what is wrong as in not-right.

Replies are listed 'Best First'.
Re^2: Reading the script code from itself
by v_melnik (Scribe) on May 29, 2014 at 10:24 UTC

    Thank you!

    What I want to acheive is to have a package full of constants needed by a project. I just want constants to be exportable by tags, but I don't want to indicate constant names twice, as I want to do it only once - when I'm defining those constants.

    So, I'd love it to look like that:

    # :tag1 use constant constant1 => 1; use constant constant2 => 2; use constant constant3 => 3; # :tag2 use constant constant4 => 4; use constant constant5 => 5; use constant constant6 => 6; # :tag3 use constant constant4 => 4; use constant constant5 => 5; use constant constant6 => 6; @EXPORT_TAGS = some_cool_internal_subrotine_making_the_hash_of_tags_to +_be_exported();

    P.S. I'm already using a complicated structure of configuration files in this project, but I want to have constants somewhere in the code where they can't be changed by an user (as configuration files acutally can be changed).

      Disclaimer: I find the design questionable... you should consider not using constant (in fact Conway's Perl Best Practices recommends against it, e.g. Perl::Critic::Policy::ValuesAndExpressions::ProhibitConstantPragma) and look at alternatives such as using a locked hash (or even a function) to return your "constant" values.

      As is said, Perl gives you just enough rope to hang yourself with, so here you go:

      package ConstExporter; use warnings; use strict; my %CONSTANTS = ( foo => "abc", bar => "xyz", quz => "123", ); sub import { my ($class, @export) = @_; my ($callpack) = caller; for my $exp (@export) { die "bad constant name '$exp'" unless exists $CONSTANTS{$exp}; no strict 'refs'; *{"${callpack}::$exp"} = sub () { $CONSTANTS{$exp} }; } } 1;

      Use it in the usual way: use ConstExporter qw/foo bar/;

        Thank you! :)

        V.Melnik