Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Multi-dimensional constants (updated)

by AnomalousMonk (Archbishop)
on Nov 22, 2020 at 06:23 UTC ( [id://11124004]=note: print w/replies, xml ) Need Help??


in reply to Multi-dimensional constants

I'm not sure exactly what you're going for, but maybe this helps:

Win8 Strawberry 5.8.9.5 (32) Sun 11/22/2020 1:19:09 C:\@Work\Perl\monks >perl use strict; use warnings; use constant INVALID_DATA => ( q{invalid}, 0 ); use constant ADD_DATA => ( q{add}, 1 ); use constant REMOVE_DATA => ( q{remove}, 2 ); use constant MODES => ( \&ADD_DATA, \&REMOVE_DATA ); warn((ADD_DATA)[0]); warn((ADD_DATA)[1]); warn((MODES)[0]); warn((MODES)[1]); warn((MODES)[0]->()); warn((MODES)[1]->()); ^Z add at - line 11. 1 at - line 12. CODE(0x1d2be34) at - line 14. CODE(0x1cf904c) at - line 15. add1 at - line 17. remove2 at - line 18.
(Update: Also works under Perl version 5.30.3.1 64-bit.)

Update 1: Changed example code above: removed unused use Data::Dumper; statement.

Update 2: The syntax &{(MODES)[0]} also works, and you may consider it more elegant:

Win8 Strawberry 5.8.9.5 (32) Sun 11/22/2020 1:34:08 C:\@Work\Perl\monks >perl use strict; use warnings; use constant ADD_DATA => qw(add 1); use constant REMOVE_DATA => qw(remove 2); use constant MODES => (\&ADD_DATA, \&REMOVE_DATA); warn &{(MODES)[0]}; warn &{(MODES)[1]}; ^Z add1 at - line 8. remove2 at - line 9.
Also works under version 5.30.


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: Multi-dimensional constants (updated)
by Ionic (Acolyte) on Nov 22, 2020 at 07:33 UTC

    I'm not sure exactly what you're going for, but maybe this helps …
    Thanks. It looks like I was thrown off by Data::Dumper not dereferencing the subroutine references and instead returning something weird, and also the general need to dereference the subroutine references in other code. Other than that, my idea seems to have been spot-on.

    Update 2: The syntax &{(MODES)[0]} also works, and you may consider it more elegant …
    I would, yes. However, this example snippet will return a syntax error (near ")["):
    my $tmp = 42 + (&((MODES)[1])())[1];
    The same goes for:
    my $tmp = 42 + (&((MODES)[1]))[1];
    Luckily, it can be worked around using:
    my $tmp_ref = (MODES)[1]; my $tmp = 42 + (&$tmp_ref())[1];
    I don't quite understand why the interpreter trips, but since it's easy to work around it using a temporary variable, I wanted to leave that here for reference as well.

      ... this example snippet will return a syntax error (near ")["):

      my $tmp = 42 + (&((MODES)[1])())[1];

      The brackets associated with the & sigil are curlies not parentheses.

      Win8 Strawberry 5.8.9.5 (32) Sun 11/22/2020 2:47:09 C:\@Work\Perl\monks >perl use strict; use warnings; use constant ADD_DATA => qw(add 1); use constant REMOVE_DATA => qw(remove 2); use constant MODES => (\&ADD_DATA, \&REMOVE_DATA); print 42 + (&{ (MODES)[0] })[1]; ^Z 43
      But I don't know if this is exactly elegant!


      Give a man a fish:  <%-{-{-{-<

        The brackets associated with the & sigil are curlies not parentheses.
        Ah, right, that works, and here's the explanation from perlref:
        Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a BLOCK returning a reference of the correct type.

Log In?
Username:
Password:

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

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

    No recent polls found