Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: how to declare a local *subname=sub{}?

by Marshall (Canon)
on Oct 31, 2016 at 04:14 UTC ( [id://1174986]=note: print w/replies, xml ) Need Help??


in reply to how to declare a local *subname=sub{}?

I am very unsure as to your question and the intent of your code? I don't see the need for type glob (*something). What is your objective?

#!/usr/bin/perl use strict; use warnings; # dispatch table... # my %table = ('x'=>\&ABC, 'y'=> sub {print "Anon sub for key 'y' in table\n";} ); sub ABC{print "sub ABC called\n";}; # call routines in the dispatch table... $table{'x'}->(); # prints: "sub ABC called" $table{'y'}->(); # prints: "Anon sub for key 'y' in table" # local can only "mask" an "our" or a global variable, like # perhaps as in the common idiom: # my $file = do { local $/; <FILE> }; # which "slurps" an entire file into the $file variable.<br> # A "my" variable cannot be "localized" our $xyzzy = 33; { local $xyzzy = 55; print "$xyzzy\n"; #prints 55 } print "$xyzzy\n"; #prints 33

Replies are listed 'Best First'.
Re^2: how to declare a local *subname=sub{}?
by AnomalousMonk (Archbishop) on Oct 31, 2016 at 05:24 UTC
    I am very unsure as to your question and the intent of your code?

    I share your uncertainty. I think perl-diddler may have invented yet another way to write spaghetti code without using goto. A dispatch table approach such as you exemplify tends to be my knee-jerk approach to the sort of problem that I imagiine gave rise to the OP.

    # local can only "mask" an "our" or a global variable ... ... # A "my" variable cannot be "localized"

    I tend to think of this a bit differently. My conception is that a my variable can be completely "localized" or isolated within a scope, whereas an our (or package global) variable cannot. The potential scoped isolation of lexical variables makes it very easy to reason about them, a great advantage.

    c:\@Work\Perl>perl -wMstrict -le "our $xyzzy = 33; print qq{A: $xyzzy}; { local $xyzzy = 55; print qq{B: $xyzzy}; zot(); print qq{C: $xyzzy}; } print qq{D: $xyzzy}; ;; sub zot { $xyzzy = 99; } " A: 33 B: 55 C: 99 D: 33 c:\@Work\Perl>perl -wMstrict -le "my $xyzzy = 33; print qq{A: $xyzzy}; { my $xyzzy = 55; print qq{B: $xyzzy}; zot(); print qq{C: $xyzzy}; zonk(); print qq{D: $xyzzy}; } print qq{E: $xyzzy}; ;; sub zot { $xyzzy = 99; } ;; sub zonk { my $xyzzy = 9999; } " A: 33 B: 55 C: 55 D: 55 E: 99

    Update: But then there's PadWalker...   (sigh)


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

      We aren't that far off.
      #!usr/bin/perl use strict; use warnings; our $xyzzy = 33; print "A: $xyzzy\n"; { local $xyzzy = 55; print "B: $xyzzy\n"; zot(); # changes $xyzzy altough no return value # zot() can modify a global variable print "C: $xyzzy\n"; } # $xyzzy is now back at the A: value print "D: $xyzzy\n"; sub zot { $xyzzy = 99; #set global "our" var } __END__ A: 33 B: 55 C: 99 D: 33

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2024-03-28 23:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found