Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Iterator to parse multiline string with \\n terminator

by Laurent_R (Parson)
on Oct 06, 2013 at 08:58 UTC ( #1057130=note: print w/ replies, xml ) Need Help??


in reply to Iterator to parse multiline string with \\n terminator

Hi,

as a side note, your anonymous function does not really act as a closure:

my $fh = IO::File->new($filename, 'r'); my $fh_iterator = sub { my $fh = shift; my $line = $fh->getline; } while (my $line = $fh_iterator->($fh)) { # do stuff to $line }

because you are passing $fh each time to the sub (and you have to, you actually get a fresh copy of $fh each time the anonymous subroutine is called).

If you want it to act as a closure, you may do something like this (untested):

sub create_iterator{ my $filename = shift; my $fh = IO::File->new($filename, 'r'); return sub { my $line = $fh->getline; } } my $fh_iterator = create_iterator($file_name); while (my $line = $fh_iterator->()) { # do stuff to $line }

Now, $fh is really a persistent variable within the sub scope, this is a real closure.


Comment on Re: Iterator to parse multiline string with \\n terminator
Select or Download Code
Re^2: Iterator to parse multiline string with \\n terminator
by three18ti (Scribe) on Oct 06, 2013 at 09:09 UTC

    What exactly makes it not a closure? Is it that I'm passing a variable each time? If it was a new copy of $fh, wouldn't $fh_iterator->($fh) always return the same line (since it's creating a copy of the $fh object, on next passing it would be a copy of the original)?

    Thanks for setting me straight, I always like learning new things.

      $fh is a file handler, i.e. it is actually an iterator on a file, so that each time you read from $fh, you get the next line. In your sub, your my $fh = shift; actually creates a new copy of $fh each time the sub is called. It still works because $fh "knows" which is the next line to read from the file. But your anonymous sub is not a closure; the alternative code I wrote is actually keeping its own copy of $fh, my anonymous sub actually closes on $fh. Please note that an anonymous function is not necessarily a closure, and a closure does not necessarily have to be anonymous (although is is often the case).

      You might want to have a look to this: Closure on Closures.

        Awesome! Thanks for the info and link.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (15)
As of 2014-10-24 15:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (132 votes), past polls