Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re: Re: Style Question on Closures

by jynx (Priest)
on Jan 01, 2002 at 07:59 UTC ( #135485=note: print w/replies, xml ) Need Help??

in reply to Re: Style Question on Closures
in thread Style Question on Closures


Firstly, thanks for the reply, i probably should've read up on subroutine parsing before posting, but i was blind to that apparently as it didn't even occur to me (*sigh* a post wasted on an RTFM question, sorry about that). That said, while it's true i didn't need to use a closure, this was practice. The reason for making the sub anonymous was so that only the get_init_strings subroutine could call it, which is a good intent, although admittedly completely wasted here. If i weren't so intent on using something i've never used before it would probably be closer to this (this code needs you to see where the loop happens since it's basically an orcish manuever):

# Code simplified for brevity (again) my @files = get_files(); my $strings_file = shift(@ARGV) || "default"; my @init_strings; foreach my $file (@files) { my @strings = @init_strings || get_init_strings($strings_file, \@init_strings); push @strings, extra_strings(); # manipulate files here ... } sub get_init_strings { my $file = shift; my $strings = shift; open FILE, $file or die "Couldn't open $file: $!\n"; push @$strings, $_ while <FILE>; close FILE, $file or warn "Couldn't close $file: $!\n"; return @$strings; }
This isn't tested, just the first thing that came to mind. And it would do what i did without any of the hassle. But it's not as much of a learning experience nor as fun :-)


Replies are listed 'Best First'.
(jeffa) Practical Use For What jeffa Thought A Closure Was (3Re: Style Question on Closures)
by jeffa (Bishop) on Jan 01, 2002 at 23:26 UTC
    There are practical uses for call-backs. One use is to provide some user of a Perl module a way to modify the behavior of that module. Here is a very simple example:
    use strict; package Foo; use Carp; sub new { my ($class,$msg) = @_; my $self = {msg => $msg}; return bless $self,$class; } sub print_me { my ($self,$cb) = @_; croak "not a code ref" unless ref $cb eq 'CODE'; return $cb->($self->{'msg'}); } package main; my $foo = Foo->new('hello world'); print $foo->print_me(sub {ucfirst shift}), "\n";
    Now the user can specify how they want the message printed. Like i said, a very simple example, but i am sure you can imagine this module doing a lot more behind the scenes. In these cases, providing a call-back instead of providing a list of choices can make a module more flexible, and keep you from maintaining that list of choices.

    UPDATE - drats. Just when i though i knew what a closure was .... perrin pointed out that this is indeed, not a closure ... a good example for a anonymous subs maybe, but not a closure. I stand corrected and apologetic to the 13 people that voted this node up.


    (the triplet paradiddle)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://135485]
[erix]: there used to be the 'razing' of towns and citoes but that now means something else in Germany (rasen=driving too fast)
[erix]: sleighting, I imagine 'Schlechten' will be a german word too - probably with same meaning as in dutch (breaking down, making useless a castle / defensive structure )
[erix]: oh... the german term is Schleifung

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2017-05-29 15:36 GMT
Find Nodes?
    Voting Booth?